一.Metasploit体系框架
- 基础库文件
Metasploit的基础库文件位于源码根目录路径下的libraries目录中,包括Rex、framework-core和framework-base三部分。
Rex(Ruby Extension)是整个Metasploit框架所依赖的最基础的一些组件,为Metasploit 开发者进行框架和模块开发提供了一些基础功能的支持,如包装的网络套接字、网络应用协议客户端与服务端实现、日志子系统、渗透攻击支持例程、PostgreSQL及MySQL数据库支持等。
framework-core 库负责实现所有与各种类型的上层模块及插件的交互接口。
framework-base 库扩展了 framework-core,提供更加简单的包装例程,并为处理框架各个方面的功能提供了一些功能类,用于支持用户接口与功能程序调用框架本身功能及框架集成模块。
- 模块
模块是通过Metasploit框架所装载、集成并对外提供的最核心的渗透测试功能实现代码。按照在渗透测试过程各个环节中所具有的不同用途,分为辅助模块(Aux)、渗透攻击模块(Exploits)、后渗透攻击模块(Post)、攻击载荷模块(Payloads)、空指令模块(Nops)和编码器模块(Encoders)。这些模块都拥有非常清晰的结构和一个预先定义好的接口,可以被装载到Metasploit框架中,并可组合支持信息搜集、渗透攻击与后渗透攻击拓展等渗透测试任务。
- 插件
Metasploit框架的插件是一类定义比较松散,能够扩充框架的功能,或者组装已有功能构成高级特性的组件。插件可以集成现有的一些外部安全工具,如Nessus、OpenVAS漏洞扫描器等,为用户接口提供一些新的功能命令、记录所有的网络记录或提供创新的渗透测试功能。
- 接口
Metasploit框架提供了多种用户使用接口,包括 msfconsole控制台终端、msfcli命令行、msfgui图形化界面、armitage图形化界面以及 msfapi 远程调用接口等。
- 功能程序
除了通过上述的用户使用接口访问Metasploit 框架主体功能之外,Metasploit还提供了一系列可直接运行的功能程序,支持渗透测试者与安全研究人员快速地利用Metasploit框 架内部能力完成一些特定任务。比如msfpayload、msfencode和msfvenom可以将攻击载 荷封装为可执行文件、C语言、JavaScript语言等多种形式,并可以进行各种类型的编码。 msf*scan 系列功能程序提供了在 PE、ELF 等各种类型文件中搜索特定指令的功能,可以帮 助渗透代码开发人员定位指令地址。
二.辅助模块
Metasploit 为渗透测试的信息搜集环节提供了大量的辅助模块支持,包括针对各种网 络服务的扫描与查点、构建虚假服务收集登录密码、口令猜测破解、敏感信息嗅探、探查 敏感信息泄露、Fuzz测试发掘漏洞、实施网络协议欺骗等模块。辅助模块能够帮助渗透测 试者在进行渗透攻击之前得到目标系统丰富的情报信息,从而发起更具目标性的精准攻击。 此外,Metasploit 辅助模块中还包含一些无须加载攻击载荷,同时往往不是取得目标系 统远程控制权的渗透攻击,例如拒绝服务攻击等。
三.渗透攻击模块
渗透攻击模块是利用发现的安全漏洞或配置弱点对远程目标系统进行攻击,以植入和 运行攻击载荷,从而获得对远程目标系统访问权的代码组件。渗透攻击模块是Metasploit 框架中最核心的功能组件。
Metasploit框架中渗透攻击模块可以按照所利用的安全漏洞所在的位置分为主动渗透攻 击与被动渗透攻击两大类。
主动渗透攻击所利用的安全漏洞位于网络服务端软件与服务承载的上层应用程序之中, 由于这些服务通常是在主机上开启一些监听端口并等待客户端连接,因此针对它们的渗透 攻击就可以主动发起,通过连接目标系统网络服务,注人一些特殊构造的包含“邪恶”攻 击数据的网络请求内容,触发安全漏洞,并使得远程服务进程执行在“邪恶”数据中包含 的攻击载荷,从而获取目标系统的控制会话。针对网络服务端的主动渗透攻击属于传统的 渗透攻击,在Metasploit中占据主流位置,此外近几年也出现了Web应用程序渗透攻击、 SCADA工业控制系统服务渗透攻击等新的热点领域。
被动渗透攻击利用的安全漏洞位于客户端软件中,如浏览器、浏览器插件、电子邮件 客户端、Office与Adobe等各种文档阅读与编辑软件。对于这类存在于客户端软件的安全 漏洞,我们无法主动地将数据从远程输入到客户端软件中,因此只能采用被动渗透攻击方 式,即构造出“邪恶”的网页、电子邮件或文档文件,并通过架设包含此类恶意内容的服 务端、发送邮件附件、结合社会工程学攻击分发并诱骗目标用户打开、结合网络欺骗和劫 持技术等方式,等目标系统上的用户访问到这些邪恶内容,从而触发客户端软件中的安全 漏洞,给出控制目标系统的 Shell会话。因为客户端软件的被动渗透攻击能够绕过防火墙等网络边界防护措施,所以近几年得到迅猛的发展,风头已经盖过了传统的网络服务端渗透 攻击。最常见的两类被动渗透攻击为浏览器软件漏洞攻击和文件格式类漏洞攻击。
四.攻击载荷模块
攻击载荷是在渗透攻击成功后促使目标系统运行的一段植入代码,通常作用是为渗透攻击者打开在目标系统上的控制会话连接。在传统的渗透代码开发中,攻击载荷只是一段 功能简单的Shellcode代码,以汇编语言编制并转换为目标系统CPU体系结构支持的机器 代码,在渗透攻击触发漏洞后,将程序执行流程劫持并跳转入这段机器代码中执行,从而完成Shellcode中实现的单一功能,比如在远程系统中添加新用户、启动一个命令行Shell 并绑定到网络端口上等。而开发渗透代码时,往往是从以前的代码中直接将Shellcode搬过 来或做些简单的修改,一些不太成熟的Shellcode还会依赖于特定版本系统中的API地址, 从而使其通用性不强,在不同版本系统上可能出现运行不正常的情况,因此开发人员不仅 需要有汇编语言知识和编写技能,还需要对目标操作系统的内部工作机制有深人理解。
Metasploit框架中引入的模块化攻击载荷完全消除了安全研究人员在渗透代码开发时进 行Shellcode编写、修改与调试的工作代价,而可以将精力集中在安全漏洞机理研究与利用 代码的开发上。此外,Metasploit还提供了Windows、Linux、UNIX和Mac OS X等大部 分流行操作系统平台上功能丰富多样的攻击载荷模块,从最简单的增加用户账号、提供命 令行Shell,到基于VNC的图形化界面控制,以及最复杂、具有大量后渗透攻击阶段功能 特性的Meterpreter,这使得渗透测试者可以在选定渗透攻击代码之后,从很多适用的攻击 载荷中选取他所中意的模块进行灵活地组装,在渗透攻击后获得他所选择的控制会话类型, 这种模块化设计与灵活组装模式也为渗透测试者提供了极大的便利。
Metasploit 攻击载荷模块分为独立(Singles)、传输器(Stager)、传输体(Stage)三种 类型。
独立 攻击 载 荷 是 完 全 自包含的,可直接独立地植入目标系统进行执行,比如 “windows/shell_bind_tcp”是适用于Windows操作系统平台,能够将Shell控制会话绑定 在指定TCP端口上的攻击载荷。在一些比较特殊的渗透攻击场景中,可能会对攻击载荷的 大小、运行条件有所限制,比如特定安全漏洞利用时可填充邪恶攻击缓冲区的可用空间很 小、Windows 7等新型操作系统所引人的NX(堆栈不可执行)、DEP(数据执行保护)等 安全防御机制,在这些场景情况下,Metasploit提供了传输器(Stager)和传输体(Stage) 配对分阶段植入的技术,由渗透攻击模块首先植入代码精悍短小且非常可靠的传输器载荷,然后在运行传输器载荷时进一步下载传输体载荷并执行。目前Metasploit中的Windows传输器载荷可以绕过NX、DEP等安全防御机制,可以兼容Windows7操作系统,而由传输器载荷进一步下载并执行的传输体载荷就不再受大小和安全防御机制的限制,可以加载如Meterpreter、VNC 桌面控制等复杂的大型攻击载荷。传输器与传输体配对的攻击载荷模块以名称中的“/”标识,如“windows/shell/bind_tcp”是由一个传输器载荷(bind_tep)和个传输体载荷(Shell)所组成的,其功能等价于独立攻击载荷“windows/shell_bind_tcp”。Metasploit所引入的多种类型载荷模块使得这些预先编制的模块化载荷代码能够适用于绝大多数的平台和攻击场景,这也为Metasploit能够成为通用化的渗透攻击与代码开发平台提供了非常有力的支持。
五.空指令模块
空指令(NOP)是一些对程序运行状态不会造成任何实质影响的空操作或无关操作指令,最典型的空指令就是空操作,在 x86 CPU 体系架构平台上的操作码是 0x90。
在渗透攻击构造邪恶数据缓冲区时,常常要在真正要执行的Shellcode之前添加一段空指令区,这样当触发渗透攻击后跳转执行Shellcode时,有一个较大的安全着陆区,从而避免受到内存地址随机化、返回地址计算偏差等原因造成的Shellcode执行失败,提高渗透攻击的可靠性。Metasploit框架中的空指令模块就是用来在攻击载荷中添加空指令区,以提高攻击可靠性的组件。
六.编码器模块
攻击载荷模块与空指令模块组装完成一个指令序列后,在这段指令被渗透攻击模块加人邪恶数据缓冲区交由目标系统运行之前,Metasploit框架还需要完成一道非常重要的工序——编码(Encoding)。如果没有这道工序,渗透攻击可能完全不会奏效,或者中途就被检测到并阻断。这道工序是由编码器模块所完成的。
编码器模块的第一个使命是确保攻击载荷中不会出现渗透攻击过程中应加以避免的“坏字符”,这些“坏字符”的存在将导致特殊构造的邪恶数据缓冲区无法按照预期目标完”全输人到存有漏洞的软件例程中,从而使得渗透攻击触发漏洞之后无法正确执行攻击载荷,达成控制系统的目标。
典型的“坏字符”就是 0x00 空字节,在大量漏洞所在的字符串操作函数中,输入字符串中的空字节会被解释为字符串的末尾,这样会将后面内容进行截断,从而使得攻击载荷没有完整地被运行,导致攻击失败。此外还有一些渗透攻击场景中,网络输入必须通过明文协议进行传输,从而需要攻击载荷的内容都是可打印字符,甚至于字母与数字字符,这时除了这些可接受字符之外的全部字符,对这个渗透攻击场景而言,就全落入了“坏字符”的范畴了。
每个渗透攻击模块根据它的漏洞利用条件与执行流程会有多个不同的“坏字符”, 渗透代码开发者需要进行测试并将它们标识出来,在Metasploit的渗透攻击模块中存在一个BadChars字段,专门用来列出需要避免的“坏字符”列表,让Metasploit选择编码器对攻击载荷进行编码时能够绕开这些“令人崩溃”的家伙们。
编码器的第二个使命是对攻击载荷进行“免杀”处理,即逃避反病毒软件、IDS人侵检测系统和IPS人侵防御系统的检测与阻断。通过各种不同形式的编码,甚至是多个编码器的嵌套编码,可以让攻击载荷变得面目全非,避免载荷中含有一些安全检测与防御机制能够轻易识别的特征码,从而能够达到“免杀”的效果。
另外值得一提的是,采用编码器对攻击载荷进行编码之后,往往会造成编码后载荷体积增大,而每个渗透攻击模块能够植人的邪恶缓冲区大小是受到漏洞触发条件限制的(通常在渗透攻击模块的Space字段中指明),因此Metasploit在自动为攻击载荷选择编码器进行编码时,可能会找不出合适的编码器,既能够将编码后的载荷大小控制在空间限制之内,又要完全避免出现“坏字符”,这种情况下会出现“No encoders encoded the buffersuccessfully”错误。
此时选择一个传输器和一个传输体配对构成的攻击载荷,能够以短小精悍的传输器来避免编码之后超出空间限制,然后在运行传输器载荷之后就不再受到空间大小的约束,就可无拘无束地下载执行你所任意指定的传输体攻击载荷了。
七.后渗透攻击模块
后渗透攻击模块(Post)是Metasploit v4 版本中正式引入的一种新类型的组件模块,主要支持在渗透攻击取得目标系统远程控制权之后,在受控系统中进行各式各样的后渗透攻击动作,比如获取敏感信息、进一步拓展、实施跳板攻击等。后渗透攻击模块将替代Meterpreter和Shell攻击载荷中的一些扩展脚本,完成在目标系统上进一步攻击功能的组件代码。后渗透攻击模块需要通过 Meterpreter或Shell 控制会话加载到目标操作系统平台上运行,因此目前 Metasploit 框架中是按照操作系统平台来组织此类模块的。现在支持最完善的Windows平台上,已有的后渗透攻击模块包括敏感信息搜集、键击记录、本地特权提升以及本地会话管理等。
在后渗透攻击阶段,Metasploit框架中功能最强大、最具发展前景的模块是Meterpreter,Meterpreter作为可以被渗透攻击植入到目标系统上执行的一个攻击载荷,除了提供基本的控制会话之外,还集成了大量的后渗透攻击命令与功能,并通过大量的后渗透攻击模块进一步提升它在本地攻击与内网拓展方面的能力。
八.官方帮助
Core Commands
Command Description
------- -----------
? Help menu
banner Display an awesome metasploit banner
cd Change the current working directory
color Toggle color
connect Communicate with a host
debug Display information useful for debugging
exit Exit the console
features Display the list of not yet released features that can be opted in to
get Gets the value of a context-specific variable
getg Gets the value of a global variable
grep Grep the output of another command
help Help menu
history Show command history
load Load a framework plugin
quit Exit the console
repeat Repeat a list of commands
route Route traffic through a session
save Saves the active datastores
sessions Dump session listings and display information about sessions
set Sets a context-specific variable to a value
setg Sets a global variable to a value
sleep Do nothing for the specified number of seconds
spool Write console output into a file as well the screen
threads View and manipulate background threads
tips Show a list of useful productivity tips
unload Unload a framework plugin
unset Unsets one or more context-specific variables
unsetg Unsets one or more global variables
version Show the framework and console library version numbers
Module Commands
Command Description
------- -----------
advanced Displays advanced options for one or more modules
back Move back from the current context
clearm Clear the module stack
favorite Add module(s) to the list of favorite modules
info Displays information about one or more modules
listm List the module stack
loadpath Searches for and loads modules from a path
options Displays global options or for one or more modules
popm Pops the latest module off the stack and makes it active
previous Sets the previously loaded module as the current module
pushm Pushes the active or list of modules onto the module stack
reload_all Reloads all modules from all defined module paths
search Searches module names and descriptions
show Displays modules of a given type, or all modules
use Interact with a module by name or search term/index
Job Commands
Command Description
------- -----------
handler Start a payload handler as job
jobs Displays and manages jobs
kill Kill a job
rename_job Rename a job
Resource Script Commands
Command Description
------- -----------
makerc Save commands entered since start to a file
resource Run the commands stored in a file
Database Backend Commands
Command Description
------- -----------
analyze Analyze database information about a specific address or address range
db_connect Connect to an existing data service
db_disconnect Disconnect from the current data service
db_export Export a file containing the contents of the database
db_import Import a scan result file (filetype will be auto-detected)
db_nmap Executes nmap and records the output automatically
db_rebuild_cache Rebuilds the database-stored module cache (deprecated)
db_remove Remove the saved data service entry
db_save Save the current data service connection as the default to reconnect on startup
db_status Show the current data service status
hosts List all hosts in the database
loot List all loot in the database
notes List all notes in the database
services List all services in the database
vulns List all vulnerabilities in the database
workspace Switch between database workspaces
Credentials Backend Commands
Command Description
------- -----------
creds List all credentials in the database
Developer Commands
Command Description
------- -----------
edit Edit the current module or a file with the preferred editor
irb Open an interactive Ruby shell in the current context
log Display framework.log paged to the end if possible
pry Open the Pry debugger on the current module or Framework
reload_lib Reload Ruby library files from specified paths
time Time how long it takes to run a particular command
msfconsole
`msfconsole` is the primary interface to Metasploit Framework. There is quite a
lot that needs go here, please be patient and keep an eye on this space!
Building ranges and lists
-------------------------
Many commands and options that take a list of things can use ranges to avoid
having to manually list each desired thing. All ranges are inclusive.
### Ranges of IDs
Commands that take a list of IDs can use ranges to help. Individual IDs must be
separated by a `,` (no space allowed) and ranges can be expressed with either
`-` or `..`.
### Ranges of IPs
There are several ways to specify ranges of IP addresses that can be mixed
together. The first way is a list of IPs separated by just a ` ` (ASCII space),
with an optional `,`. The next way is two complete IP addresses in the form of
`BEGINNING_ADDRESS-END_ADDRESS` like `127.0.1.44-127.0.2.33`. CIDR
specifications may also be used, however the whole address must be given to
Metasploit like `127.0.0.0/8` and not `127/8`, contrary to the RFC.
Additionally, a netmask can be used in conjunction with a domain name to
dynamically resolve which block to target. All these methods work for both IPv4
and IPv6 addresses. IPv4 addresses can also be specified with special octet
ranges from the [NMAP target
specification](https://nmap.org/book/man-target-specification.html)
### Examples
Terminate the first sessions:
sessions -k 1
Stop some extra running jobs:
jobs -k 2-6,7,8,11..15
Check a set of IP addresses:
check 127.168.0.0/16, 127.0.0-2.1-4,15 127.0.0.255
Target a set of IPv6 hosts:
set RHOSTS fe80::3990:0000/110, ::1-::f0f0
Target a block from a resolved domain name:
set RHOSTS www.example.test/24