平台通用性:Meterpreter 提供了基于 JAVA 和 PHP 语言的实现,以应用在各种不同的环境中
纯内存工作模式:执行漏洞渗透攻击的时候,会直接装载 Meterpreter 的动态链接库到目标进程空间中,而不是先将 Meterpreter 上传到磁盘然后再调用 Loadlibrary 加载动态链接库来启动 Meterpreter。这里便会有一个技术问题, Loadlibrary 只能从磁盘或者网络共享里加载动态链接库而不能直接从内存中进行加载;这时 Metasploit 的处理办法是 HOOK Loadlibrary 调用的一些内核 API,这种钩子技术允许 Meterpreter 的动态链接库从内存中直接加载,而不会在目标主机的磁盘上留下任何痕迹。这种纯内存工作模式的好处是启动隐蔽,很难被杀毒软件监测打。此外也不需要访问目标主机磁盘,基本不留下入侵的证据,同时这种模式不需要创建新的进程,避免了在 chroot 环境下运行的尴尬
灵活且加密的通信协议:Meterpreter 提供了灵活且加密的客户端服务通信协议,能够对网络传输进行加密,同时这种通信协议设计支持灵活的功能扩展。
Meterpreter 的网络通信协议采用 TLV (Type Length Value) 数据封装格式。其中 Type 占 4 字节,不同命令与数据类型对应不同的 Type 值;Length为 4 字节,包含了 三个字段的总长度;Value 为封装的数据内容,也可以为 TLV 的数据格式。这种循环嵌套的封装形式既提供了高度的灵活性,允许描述复杂的数据结构,又保证了传输的鲁棒性。另外,Meterpreter 的通信数据进行了加密狐狸,首先对发送输几局进行 16 字节一组的 XOR 加密,然后调用 OpenSSL 库对应用层数据进行 SSL 封装传输。
易于扩展:Meterpreter 在功能上来说不是一般的 Shellcode 能比拟的,如果用户需要一些特殊或者定制的功能,可以轻易的在 Meterpreter 中添加扩展 (或插件) 来实现。Meterpreter 的插件以动态链接库文件的形式存在,可以选择不同的编程语言按照 Meterpreter 的接口形式编写需要的功能,然后编译成动态链接库,拷贝到 …/framework/data/meterpreter 目录下即可,使用的时候在 Meterpreter 会话中使用 use 命令进行加载。在 msf3/scripts/meterpreter 目录下,有许多 Meterpreter 的扩展脚本可以参考,自己的扩展脚本也可以放置在这个目录下,在 Meterpreter 会话中通过 run 命令使用。
首先获得 Meterpreter 的 Shell 会话
通过 Metasploit 中的 MS08_067 漏洞渗透攻击模块获得。具体操作如下:
可以使用 “?” 或 “help” 命令获得 Meterpreter 命令的帮助信息。
Meterpreter 命令分为基本命令、文件系统命令、网络命令、系统命令和用户接口命令几大类。用户接口命令是用户使用 use 命令加载插件后产生的命令。
基本命令包含 Meterpreter 与 MSF 终端、Ruby 接口、目标 shell 等交互的命令
① background 命令
若想在 MSF 终端中执行其他任务,可以使用 background
命令将 Meterpreter 终端隐藏在后台:
② session 命令
Metasploit 的 session
命令可以查看已经成功获取的会话,如果想继续与某会话进行交互,可以使用 session -i
命令:
③ shell 命令
shell
命令可以获取系统的控制台 Shell,如果目标系统上的命令行可执行程序不存在或禁止访问,那么 shell 命令会出错。成功的运行结果如下:
④ irb 命令
irb
命令可以在 Meterpreter 会话里与 Ruby 终端进行交互,直接调用 Metasploit 封装好的函数,如下显示了使用 irb 命令调用 client.sys.config.sysinfo()
函数获取系统配置信息的结果:
在 irb 中还可以通过添加 Metasploit 的附加组件—— Railgun,直接与 Windows 本地的 API 进行交互。Railgun 是 Meterpreter 的 Ruby 语言扩展,允许在目标机上使用所有的 Windows API。
meterpreter > irb
[*] Starting IRB shell
[*] The 'client' variable holds the meterpreter client
>> client.core.use("railgun")
=> true
在添加 Railgun 扩展后,就可以直接调用 Windows API 了。
如下调用 MessageBoxA API 函数:
client.railgun.user32.MessageBoxA(0,"hello! world", NULL,MB_OK)
这行代码会在目标机上弹出 “hello~world” 窗口。
调用下面这行代码,将阻止目标主机在 Meterpreter 会话期间进入休眠状态,防止管理员不在时主机自动休眠造成 Meterpreter 会话的丢失:
client.railgun.kerne132.SetThreadExecutionState("ES_CONTINUOUS | ES_SYSTEM_REQUIRED")
文件系统命令允许 Meterpreter 与目标的文件系统进行交互,包括查看文件内容、上传下载文件、对文件进行搜索、直接编辑文件等功能。
① cat 命令
使用 cat
命令查看文件内容:
上述命令在 system 权限下,可以读取目标及其上的 boot.ini 文件,并获得引导文件信息。这里要注意必须使用双斜杠进行转义。
② getwd 命令
getwd
命令可以获得目标机上当前的工作目录;相似的命令有 getlwd
,这个命令可以获得当前系统的工作目录。
③ upload 命令
Meterpreter 的 upload
命令可以上传文件或文件夹到目标及其上。参数 -r
可以将文件夹内的文件或文件夹递归的上传,不需要考虑多层目录的问题。
可以在目标主机上的 C 盘下找到 putty.exe 文件
若使用 -r 参数,则可以将文件夹中的文件和文件夹递归上传:
④ download 命令
download
命令从目标机上下载文件或文件夹,需要注意的是这里需要用双斜杠进行转义:
在本机的当前目录下就会出现一个 Netlog.txt 文件
⑤ edit 命令
使用 edit
命令可以调用 vi 编辑器,对目标机上的文件进行编辑:
输入命令:edit c:\\windows\\system32\\drivers\\etc\\hosts
直接编辑受控主机的 hosts 文件。
⑥ search 命令
search
命令支持对远程目标机上的文件进行搜索,用参数 -h
查看帮助如下:
参数 -d
指定搜索的起始目录或驱动,如果为空将进行全盘搜索;参数 -f
指定搜索的文件或部分文件名,支持星号 (*) 匹配;参数 -r
递归搜索子目录。
如下命令在目标主机的 C:\windows 目录下搜索数据库文件:
① ipconfig 命令
ipconfig
命令用于获取目标主机上的网络接口信息:
② portfwd 命令
portfwd
命令是 Meterpreter 内嵌的端口转发器,一班在目标主机开放的端口不允许直接访问的情况下使用。比如说:目标主机开放的远程桌面 3389 端口只允许内网访问,这时可以使用 portfwd 命令进行端口转发,以达到直接访问目标主机的目的。
portfwd 的帮助信息如下:
假设目标机开放了 3389 端口,使用如下命令将其转发到本地的 1234 端口:
portfwd add -l 1234 -p 3389 -r 10.10.10.130
可以看到本地的 1234 端口已经开放:
接下来就可以使用 BT5 的 rdesktop
命令连接本地 1234 端口,与远程主机的 3389 端口建立连接。
③ route 命令
route
命令用于显示目标主机的路由信息:
① ps 命令
ps
命令用于获得目标主机上正在运行的进程信息:
② migrate 命令
使用 migrate
命令可以将 Meterpreter 会话从一个进程移植到另一个进程的内存空间中。可以把会话移植到稳定的系统服务进程中,如 explorer.exe。而且这种移植是无缝移植,不需要断开已有的 TCP 连接再建立新的连接。
注:根据之前的 ps 命令可以获取目标主机进程的进程号,可以查到 explorer.exe 的进程号为 220。
③ execute 命令
execute
命令可以在目标机上执行文件。帮助信息如下:
下面的命令可以在目标机上隐藏执行 cmd.exe 程序:
execute -H -f cmd.exe
若去掉 -H
参数,则会在目标机上弹出 cmd 框。
若想直接与 cmd 进行交互,可以使用 -i
参数:
execute 命令的 -m
参数支持直接从内存中执行攻击端的可执行文件:
④ getpid 命令
getpid
命令用于获得当前会话所在进程的PID值:
⑤ kill 命令
kill
命令用于终结指定的 PID 进程
⑥ getuid 命令
getuid
命令用于获得运行 Meterpreter 会话的用户名,从而查看当前会话具有的权限:
⑦ sysinfo 命令
sysinfo
命令用于得到目标系统的一些信息,包括机器名、使用的操作系统等:
⑧ shutdown 命令
shutdown
命令用于关闭目标主机,同时 Meterpreter 会话也将被关闭。