第一次亲密接触MSF
Metasploit Framework介绍
Metasploit是一款开源安全漏洞检测工具,附带数百个已知的软件漏洞,并保持频繁更新。被安全社区冠以“可以黑掉整个宇宙”之名的强大渗透测试框架。
专业术语
渗透攻击(Exploit),指由攻击者或渗透测试者利用一个系统、应用或服务中的安全漏洞,所进行的攻击行为。 攻击载荷(Payload),是我们期望目标系统在被渗透攻击之后去执行的代码。 Shellcode,是在渗透攻击是作为攻击载荷运行的一组机器指令,通常用汇编语言编写。 模块(Module),指Metasploit框架中所使用的一段软件代码组件,可用于发起渗透攻击或执行某些辅助攻击动作。 监听器(Listener),是Metasploit中用来等待网络连接的组件。
模块
模块分类
auxiliary encoders exploits nops payloads post
模块是通过Metasploit框架所装载、集成并对外提供的最核心的渗透测试功能实现代码。分为辅助模块(Aux)、渗透攻击模块(Exploits)、后渗透攻击模块(Post)、攻击载荷模块(payloads)、编码器模块(Encoders)、空指令模块(Nops)。这些模块拥有非常清晰的结构和一个预定义好的接口,并可以组合支持信息收集、渗透攻击与后渗透攻击拓展。
辅助模块--auxiliary
执行信息收集、枚举、指纹探测、扫描等功能的辅助模块(没有payload的exploit模块)
在渗透信息搜集环节提供了大量的辅助模块支持,包括针对各种网络服务的扫描与查点、构建虚假服务收集登录密码、口令猜测等模块。此外,辅助模块中还包括一些无须加载
攻击载荷,同时往往不是取得目标系统远程控制权的渗透攻击,例如:拒绝服务攻击。
编码器模块--encoders
对payload进行加密,躲避AV检查的模块
攻击载荷与空指令模块组装完成一个指令序列后,在这段指令被渗透攻击模块加入邪恶数据缓冲区交由目标系统运行之前,Metasploit框架还需要完成一道非常重要的工序--
--编码。 编码模块的第一个使命是确保攻击载荷中不会出现渗透攻击过程中应加以避免的”坏字符“。 编码器第二个使命是对攻击载荷进行”免杀“处理,即逃避反病毒软件、IDS入侵检测系统和IPS入侵防御系统的检测与阻断。
渗透攻击模块--exploits
利用发现的安全漏洞或配置弱点对远程目标系统进行攻击,以植入和运行攻击载荷,从而获得对目标系统访问控制权的代码组件。metasploit框架中渗透攻击模块可以按照所
利用的安全漏洞所在的位置分为主动渗透攻击与被动渗透攻击两大类。 主动渗透攻击:所利用的安全漏洞位于网络服务端软件与服务端软件承载的上层应用程序之中,由于这些服务通常是在主机上开启一些监听端口并等待客户端连接,通过连接目
标系统网络服务,注入一些特殊构造的包含“邪恶”攻击数据的网络请求内容,触发安全漏洞,并使得远程服务进行执行“邪恶”数据中包含的攻击载荷,从而获取目标系统的控制
会话。针对网络服务端的主动渗透攻击属于传统的渗透攻击。还有web应用程序渗透攻击、SCADA工业控制系统服务渗透攻击。
空指令模块--nops
提高payload稳定性及维持大小
空指令(NOP)是一些对程序运行状态不会造成任何实质影响的空操作或无关操作指令,最典型的空指令就是空操作,在X86 CPU体系结构平台上的操作码是ox90. 在渗透攻击构造邪恶数据缓冲区时,常常要在真正要执行的Shellcode之前添加一段空指令区,这样当触发渗透攻击后跳转执行ShellCode时,有一个较大的安全着陆区,
从而避免受到内存地址随机化、返回地址计算偏差等原因造成的ShellCode执行失败,提高渗透攻击的可靠性。
攻击载荷模块--payloads
攻击载荷是在渗透攻击成功后促使目标系统运行的一段植入代码,通常作用是为渗透攻击者打开在目标系统上的控制会话连接。在传统的渗透代码开发中,攻击载荷只是一段功
能简单的ShellCode代码,以汇编语言编制并转换为目标系统CPU体系结构支持的机器代码,在渗透攻击触发漏洞后,将程序执行流程劫持并跳转入这段机器代码中执行,从而
完成ShellCode中实现的单一功能。 metasploit攻击载荷模块分为独立(Single)、传输器(Stager)、传输体(Stage)三种类型。 独立攻击载荷是完全自包含的,可直接独立地植入目标系统进行执行,比如“windows/shell_bind_tcp"是适用于Windows操作系统平台,能够将Shell控制会话绑定在指定
TCP端口上的攻击载荷。在一些比较特殊情况下,可能会对攻击载荷的大小、运行条件有所限制,比如特定安全漏洞利用时可填充邪恶攻击缓冲区的可用空间很小、windows 7
等新型操作系统所引入的NX(堆栈不可执行)、DEP(数据执行保护)等安全防御机制,在这些场景情况下,Metasploit提供了传输器和传输体配对分阶段植入的技术,由渗透
攻击模块首先植入代码精悍短小且非常可靠的传输器载荷,然后在运行传输器载荷时进一步下载传输体载荷并执行。
后渗透模块--post
主要支持在渗透攻击取得目标系统远程控制权之后,在受控系统中进行各种各样的后渗透攻击动作,比如获取敏感信息,进一步括展,实施跳板攻击等。
基本使用
Metasploit三种用户接口(MSF终端、MSF命令行、Armitage)
Armitage:图形界面
Metasploit框架中的armitage组件是一个完全交互式的图形化用户接口。
msfcli 使用接口,现在已经更新至 msfconsole -x
MSF终端以一种用户友好的模式来提供交互方式,用于访问软件所有的功能特性,而msfcli则主要考虑脚本处理和其他命令行工具的互操作性。最新版本:msfcli被整合进ms
fconsole的参数里。
例如: 老指令: msfcli multi/samba/usermap_scriptPAYLOAD=cmd/unix/bind_netcat RHOST=192.168.200.129E 新指令: msfconsole -x "use exploit/multi/samba/usermap_script; set RHOST 192.168.200.129; set PAYLOAD cmd/unix/bind_netcat;[set LHOST IP;] r
un"
msfconsole 使用接口
最流行的用户接口 几乎可以使用全部 msf 功能 控制台命令支持 TAB 自动补全 支持外部命令的执行(系统命令等)
启动前的准备
使用前先升级:msfupdate
启动msf
在启动msf时使用的参数选项
通用选项: -E, --environment ENVIRONMENT 设置Rails环境,默认为RAIL_ENV环境变量或'生产' 数据库选项: -M, --migration-path DIRECTORY 指定包含其他数据库迁移的目录 -n, --no-database 禁用数据库支持 -y, --yaml PATH 指定一个包含数据库设置的YAML文件 框架选项: -c FILE 加载指定的配置文件 -v, -V, --version 显示版本 模块选项: --defer-module-loads 除非明确询问,否则推迟模块加载 -m, --module-path DIRECTORY 加载一个额外的模块路径 控制台选项: -a, --ask 在退出Metasploit之前询问或接受'退出-y' -H, --history-file FILE 将命令历史记录保存到指定的文件 -L, --real-readline 使用系统Readline库而不是RbReadline -o, --output FILE 输出到指定的文件 -p, --plugin PLUGIN 在启动时加载插件 -q, --quiet 不要在启动时显示 banner 信息 -r, --resource FILE 执行指定的资源文件( - 用于stdin) -x, --execute-command COMMAND 执行指定的控制台命令(使用;用于倍数) -h, --help 显示此消息
MSF控制台命令
常用命令
banner 每次显示不同的小贴士
color 高亮显示模块名字
connect 连接指定ip指定端口上的服务(connect -h可以获取详细参数)
show show 显示给定类型的模块或所有模块(auxiliary / exploits / payloads / encoders / nops)
search 搜索指定关键字
---search name:mysql / platform:aix / type:aux / author:aaron / cve:2011 / 可多条件同时搜索
use 使用模块
show 在使用模块的情况下show显示(options / payload / targets / advanced / evasion / missing)
info 显示有关一个或多个模块的信息
back 返回从当前上下文返回
Check 检查模块能不能被利用,就是检查目标系统有没有这个漏洞(大部分模块不能执行这个命令)
exit 退出msf
set 设置参数
unset 取消设置的参数
setg 设置全局参数,所有模块有这个参数就已经被设置(只在本次启动msf使用有效)
unsetg 取消全局设置
save 保存当前设置的参数
Run 执行模块
exploit 执行模块
jobs 查看所有后台任务
kill 杀掉进程
load 加载其他插件
unload 卸载载入的插件
loadpath 加载某个目录的插件(一般用于使用自己编写模块)
Sessions 查看会话、切换会话
route 通过指定session路由流量
例子:route add 10.1.1.0 255.255.255.0 4
resource 配置流程
例子:msfconsole -r a.rc
a.rc里面的内容就是使用模块的配置
MSF数据库命令
没有进入msf前可以执行的关于数据库的命令
msfdb init 初始化数据库 msfdb reinit 删掉以前初始化的数据库,然后重新初始化数据库 msfdb delete 删掉现在的数据库 msfdb start 启动数据库 msfdb stop 关掉数据库
注意: MSF数据库有问题 可以重新初始化数据库 msfdb reinit 没必要重新安装MSF 另外msf自带数据库为postgresql
进入msf后可以执行的关于数据库的命令
db_status 查看连接数据库的状态
db_rebuild_cache 重建数据库缓存(重建的是msf各种模块的信息,一般用在初始化数据库后)
db_nmap 集成nmap工具,可以在msf里使用nmap,命令格式和使用nmap一样,结果保存到数据库
db_disconnect 断开与当前数据库的连接
db_connect 连接其它数据库
kali自带数据库的位置:--/usr/share/metasploit-framework/config/database.yml
db_import 数据库的导入
例子:db_import /root/bak.xml
注意:
配合namp使用,生成xml文件,也可以导入到msf数据库
例子:nmap -A 192.168.12.3 -oX nmap.xml
db_import /root/namp.xml
db_export 数据库的导出
例子:db_export -f xml /root/bak.xml
hosts 查看数据库中所有主机信息
例子:hosts -c address,os_flavor
hosts -S Linux
host 查看指定ip的信息
例子:host 1.1.1.1
services 查看所有主机开放端口情况
例子:services -p 80
services -c info,name -p 1-1000
creds 查看所有破解的服务信息
vulns 查看所有测试出来的漏洞信息
loot 查看所有获取的hash值
注意:我们在启动msf时,会自动启动后台数据库,如果你在使用db_status命令发现数据库没有连接。
数据库是用来存储我们测试过程中的结果,没有数据库也能使用,但是肯定体验感极差!!!
执行下面的语句启动msf数据库:
service postgresql start
msfdb start
netstat -pantu | grep 5432
核心命令
============= 命令 描述 ------- ----------- ? 帮助菜单 banner 显示一个很棒的metasploit横幅 cd 更改当前的工作目录 color 切换高亮显示颜色 connect 连接与主机通信 exit 退出退出控制台 get 获取特定于上下文的变量的值 getg 获取全局变量的值 grep Grep另一个命令的输出 help 帮助菜单 history 历史显示命令历史 irb 进入irb脚本模式 load 加载一个框架插件 quit 退出控制台 route 路由通过会话路由流量 save 保存保存活动的数据存储 sessions 会话转储会话列表并显示有关会话的信息 set 将特定于上下文的变量设置为一个值 setg 将全局变量设置为一个值 sleep 睡眠在指定的秒数内不执行任何操作 spool 将控制台输出写入文件以及屏幕 threads 线程查看和操作后台线程 unload 卸载卸载框架插件 unset 取消设置取消设置一个或多个特定于上下文的变量 unsetg 取消设置取消设置一个或多个全局变量 version 版本显示框架和控制台库版本号 模块命令 =============== 命令 描述 ------- ----------- advanced 高级显示一个或多个模块的高级选项 back 返回从当前上下文返回 edit 编辑使用首选编辑器编辑当前模块或文件 info 显示有关一个或多个模块的信息 loadpath 加载路径搜索并加载路径中的模块 options 选项显示全局选项或一个或多个模块 popm 将最新的模块从堆栈弹出并使其处于活动状态 previous 将之前加载的模块设置为当前模块 pushm 将活动或模块列表推入模块堆栈 reload_all 重新加载所有定义的模块路径中的所有模块 reload_lib 从指定路径加载库文件 search 搜索搜索模块名称和说明 show 显示给定类型的模块或所有模块 use 使用按名称选择模块 工作命令 ============ 命令 描述 ------- ----------- handler 处理程序作为作业启动负载处理程序 jobs 作业显示和管理作业 kill 杀死一份工作 rename_job 重命名作业 资源脚本命令 ======================== 命令 描述 ------- ----------- makerc 保存从开始到文件输入的命令 resource 运行存储在文件中的命令 数据库后端命令 ========================= 命令 描述 ------- ----------- db_connect 连接到现有的数据库 db_disconnect 断开当前数据库实例 db_export 导出包含数据库内容的文件 db_import 导入扫描结果文件(文件类型将被自动检测) db_nmap 执行nmap并自动记录输出 db_rebuild_cache 重建数据库存储的模块缓存 db_status 显示当前的数据库状态 hosts 列出数据库中的所有主机 loot 列出数据库中的所有战利品 notes 列出数据库中的所有注释 services 列出数据库中的所有服务 vulns 列出数据库中的所有漏洞 workspace 在数据库工作区之间切换 凭证后端命令 ============================ 命令 描述 ------- ----------- creds 列出数据库中的所有凭据(密码)