Metasploit
注 : 笔记中拓扑图 xmind 源文件在其图片目录下
免责声明
本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.
简介
Metasploit 是一个漏洞框架,拥有超过 1700 个漏洞利用程序,大大简化了渗透测试的工作,同时具有模块化的体系结构,渗透测试人员可以很方便的添加或修改exploit.
项目地址
https://github.com/rapid7/metasploit-framework
文章 & Reference
图形化 UI
FunnyWolf/Viper - 非常牛逼,推荐
安装及维护
安装
使用 Rapid7 的一套快速安装项目 metasploit-omnibus,可以实现一句话安装
安装完成后位置 /opt/metasploit-framework/embedded/framework/
框架组成
Metasploit 主要包含了以下几个功能模块
msfconsole:整个框架最基本的模块,所有的功能都可以该模块下运行。
msfvenom:代替了 msfpayload 和 msfencode 的功能,效率更高。
msfupdate:用于软件更新,更新漏洞库和利用代码。
msfweb:Metasploit Framework 的 web 组件,支持多用户,是 Metasploit 图形化接口。
目录结构
启动
更新
对于 kali 自带的 msf 可以使用 apt 更新
嫌官方源速度慢可以添加阿里云的源
也可以直接使用 msfupdate
Module database cache not built yet, using slow search
注: 5.0.0 之后就不需要这个了
添加一个新的 exploit
在
/usr/share/metasploit-framework/modules/exploits/目录下新建一个自定义文件夹 aaatest,将 rb 脚本扔进去启动 metasploit
输入 reload_all 重新加载所有模块
use exploit/aaatest/exp(输入的时候可以用 tab 补全,如果不能补全说明就有问题)
msfvenom
使用 msfvenom 生成 payload 内容见 权限维持
基本使用
启动
启动后
常用模块
信息收集
利用 auxiliary 这个模块来获取目标网端的信息,包括端口开放情况、主机存活情况.
爆破
meterpreter
Meterpreter 属于 stage payload,在 Metasploit Framework 中,Meterpreter 是一种后渗透工具,它属于一种在运行过程中可通过网络进行功能扩展的动态可扩展型 Payload。这种工具是基于 “内存 DLL 注入” 理念实现的,它能够通过创建一个新进程并调用注入的 DLL 来让目标系统运行注入的 DLL 文件。
首先目标先要执行初始的溢出漏洞会话连接,可能是 bind 正向连接,或者反弹 reverse 连接。反射连接的时候加载 dll 链接文件,同时后台悄悄处理 dll 文件。其次 Meterpreter 核心代码初始化, 通过 socket 套接字建立一个 TLS 加密隧道并发送 GET 请求给 Metasploit 服务端。Metasploit 服务端收到这个 GET 请求后就配置相应客户端。最后,Meterpreter 加载扩展,所有的扩展被加载都通过 TLS 进行数据传输。
Tips
可以将攻击代码写入 configure.rc(只要是以 .rc 结尾的文件)配置文件中,然后使用命令
进行自动攻击
获取会话
handler
cmdshell 升级为 meterpreter
如果最开始获取的是 cmdshell,后来发现这台机器非常适合作为测试其它终端的跳板,这个时候 cmdshell 的功能已经不能满足需要,升级成 meterpreter 就十分有必要.sessions -u "id" 将该 cmdshell 升级成 meterpreter
注意事项
如果 meterpreter session 创建成功了,但很快就断连,此时应该修改使用的 payload,优先改成 generic/shell_reverse_tcp 等
如果还不成功,切换回连端口或者改成 bind shell 试试
信息收集
查看权限
截屏
摄像头
环境检测
抓取密码
sniffer
对抓取的包进行解包
权限提升
绕过 UAC
通常 webshell 的权限都比较低,能够执行的操作有限,没法查看重要文件、修改系统信息、抓取管理员密码和 hash、安装特殊程序等,所以我们需要获取系统更高的权限
什么是 UAC?
Microsoft 的 Windows Vista 和 Windows Server 2008 操作系统引入了一种良好的用户帐户控制架构,以防止系统范围内的意外更改,这种更改是可以预见的,并且只需要很少的操作量.它是 Windows 的一个安全功能,它支持防止对操作系统进行未经授权的修改,UAC 确保仅在管理员授权的情况下进行某些更改.如果管理员不允许更改,则不会执行这些更改,并且 Windows 系统保持不变.
UAC 如何运行?
UAC 通过阻止程序执行任何涉及有关系统更改/特定任务的任务来运行.除非尝试执行这些操作的进程以管理员权限运行,否则这些操作将无法运行.如果你以管理员身份运行程序,则它将具有更多权限,因为它将被"提升权限",而不是以管理员身份运行的程序.
因为有的用户是没有管理员权限,没有管理员权限是运行不了那些只能通过管理员权限才能操作的命令.比如修改注册表信息、创建用户、读取管理员账户密码、设置计划任务添加到开机启动项等操作.
最直接的提权命令 : getsystem
绕过 UAC 防护机制的前提是我们首先通过 explloit 获得目标主机的 meterprter.获得 meterpreter 会话 1 后,输入以下命令以检查是否是 system 权限.这里直接上命令.我们需要把获取到的 session 保存到后台,执行 background
Windows 权限提升绕过 UAC 保护(内存注入)
通过 COM 处理程序劫持
此模块将通过在 hkcu 配置单元中创建 COM 处理程序注册表项来绕过 Windows UAC.当加载某些较高完整性级别进程时,会引用这些注册表项,从而导致进程加载用户控制的 DLL.这些 DLL 包含导致会话权限提升的 payload.此模块修改注册表项,但在调用 payload 后将清除该项.这个模块需要 payload 的体系架构和操作系统匹配,但是当前的低权限 meterpreter 会话体系架构中可能不同.如果指定 exe::custom,则应在单独的进程中启动 payload 后调用 ExitProcess().此模块通过目标上的 cmd.exe 调用目标二进制文件.因此,如果 cmd.exe 访问受到限制,此模块将无法正常运行.
通过 Eventvwr 注册表项
此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动 Windows 事件查看器时调用的自定义命令来绕过 Windows UAC.它将生成关闭 UAC 标志的第二个 shell.此模块修改注册表项,但在调用 payload 后将清除该项.该模块不需要 payload 的体系架构和操作系统匹配.如果指定 EXE ::Custom,则应在单独的进程中启动 payload 后调用 ExitProcess().
利用系统漏洞提权
除了这些模块还有其它的通过直接通过 incognito 中的 add_localgroup_user 提升、ms13-081、ms15-051、ms16-032、MS16-016、MS14-068、ms18_8120_win32k_privesc 域权限提升等其它的权限提升方法.
令牌假冒
在用户登录 windows 操作系统时,系统都会给用户分配一个令牌(Token),当用户访问系统资源时都会使用这个令牌进行身份验证,功能类似于网站的 session 或者 cookie.
msf 提供了一个功能模块可以让我们假冒别人的令牌,实现身份切换,如果目标环境是域环境,刚好域管理员登录过我们已经有权限的终端,那么就可以假冒成域管理员的角色.
文件操作
操作文件系统
上传和下载
搜索文件
改变文件时间
横向
域管理员嗅探
端口转发和内网代理
网络命令
其中路由信息对于渗透者来说特有用,因为攻击机处于外网,目标主机处于内网,他们之间是不能通信的,故需要添加路由来把攻击机的 IP 添加到内网里面,这样我们就可以横扫内网,就是所谓的内网代理.
首先我们需要获取网段,然后再添加路由,添加成功后就可以横向扫描内网主机.
或者自动化
portfwd
portfwd 是 meterpreter 提供的端口转发功能,在 meterpreter 下使用 portfwd -h 命令查看该命令参数.
pivot
pivot 是 msf 最常用的代理,可以让我们使用 msf 提供的扫描模块对内网进行探测.
如果其它程序需要访问这个内网环境,就可以建立 socks 代理
msf 提供了3个模块用来做 socks 代理.
直接运行 run 命令,就可以成功创建一个 socks4 代理隧道,在 linux 上可以配置 proxychains 使用,在 windows 可以配置 Proxifier 进行使用.
权限维持
关闭防病毒软件
一个技巧是注入到 service.exe/svchost.exe 或 高权限杀软中 干掉 其他杀软
关闭进程
键盘记录
执行程序
进程迁移
当 meterpreter 单独作为一个进程运行时容易被发现,如果将它和系统经常运行的进程进行绑定,就能够实现持久化.
后门
MSF 自带两种植入后门的方式
Meterpreter 的 shell 运行在内存中,目标重启就会失效,如果管理员给系统打上补丁,那么就没办法再次使用 exploit 获取权限,所以需要持久的后门对目标进行控制
metsvc 服务后门
原理:命令运行成功后会在
C:\Users\用户名\AppData\Local\Temp目录下新建随机名称的文件夹,里面生成3个文件(metsvc.dll、metsvc-server.exe、metsvc.exe)同时会新建一个服务,显示名称为 Meterpreter,服务名称为 metsvc,启动类型为"自动",绑定在 31337 端口.persistence 启动项后门
原理就是在
C:\Users\用户名\AppData\Local\Temp下上传一个 VBS 脚本,通过该脚本,在注册表HKLM\Software\Microsoft\Windows\CurrentVersion\Run\下新建一个开机启动项
RDP
vnc
注册表操作
通过注册表设置开机自启动
通过注册表复制克隆用户
痕迹清除
反电子取证
stage 和 stageless 的区别
以下部分内容来自 探寻Metasploit Payload模式背后的秘密
在 MSF 里有很相似的 metasploit payload,比如
这2者有什么关系呢?以 08067 模块的利用为例
Stage
bootstrap(starger) : shellcode
metserv : Meterpreter 核心文件
stdapi : 计算机文件、系统、网络等属性的访问
priv : 权限提升、转储密码 hash 和本地提权
当我们使用 metasplit 的 ms08_067_netapi 模块之后,使用 payload/windows/meterpreter/reverse_tcp 模块,并开启一个 multi/handler 连接监听着我们本机的 4444 端口,有了解过缓冲区溢出的同学可能都知道,攻击者会利用软件的某个缺陷来传输一段很长的 shellcode 来溢出目标的缓冲区,从而控制 EIP 指针来跳转到我们的 shellcode 上,执行我们的代码,但是这段 shellcode 并不能过长,shellcode 过长,可能会导致覆盖到了上一函数栈帧的数据,导致异常的发生。所以像我们攻击者最希望就是生成一段短小精悍的 shellcode
像下面这张图,我们攻击机像目标靶机发送了一段 shellcode,并覆盖了 EIP,导致程序执行的时候跳回 shellcode 的开头,从而控制程序的执行情况,执行我们的恶意代码,这段恶意代码就只要干两件事,第一件事就是向内存申请开辟一块空间,第二件事就是回连我们的 4444 端口,这段 shellcode 为我们干的事情就好像是一个前排冲锋的战士,打开城墙的大门好让更多的精兵冲进来。我们称这段 shellcode 为 stage0,也就是第一阶段
这时,我们的攻击机,已经开始监听 4444 端口了,只要连接一成功,就会把 meterpreter shell 最核心的 dll 文件发送到靶机上
我们之前说过,当靶机运行了我们的 shellcode,会在内存里面开辟一块土地,这个地方就是为我们的 metsrv 留的,metsrv.dll 这个文件是 meterpreter 的核心组件,有了他,我们才能获取到一个 meterpreter shell,当 metsrv 传输成功之后,shellcode 就会把控制权转给 metsrv,metsrv 这时再去请求另外两个 dll 文件 stdapi 和 priv。这个时候目标就上线了.
Stageless
现在我们知道了 meterpreter/reverse_tcp 是分阶段的 shellcode,并且他分阶段的原因是因为在溢出攻击的时候 shellcode 应该尽可能保持得更短,这个时候理解他小兄弟 meterpreter_reverse_tcp 就方便的多,和 meterpreter/reverse_tcp 不同的是,他的小兄弟 meterpreter_reverse_tcp 是一个不分阶段的 payload,我们称之为 stageless(unstage),他在生成的时候就已经将我们获取一个 meterpreter 必须要用的 stdapi 已经包含在其中了。那这又有什么好处呢?试想一下,如果我们通过层层的代理,在内网进行漫游,这个时候使用分阶段的 payload 如果网络传输出现了问题,metsrv.dll 没有加载过去,可能就会错失一个 shell,stageless 的 payload 会让人放心不少
默认的 stageless payload 只会包含 stageless,所以如果想将 stdapi 和 priv 两个组件给包含进去的话我们可以用 extensions 命令:
回弹至 nc
分阶段的 payload,我们必须使用 exploit/multi/handler 这个模块使用,但是当我们想回弹一个基础的 shell 的时候,其实可以使用 nc 来监听端口直接回连到 nc 上
当有时获取到了 root 权限,想反弹 linux shell 的时候,这时 meterprter 的需求就不是那么高了,我们就可以使用 shell_reverse_tcp(或者是 bind) 来生成一个 stageless 的 bash 脚本,直接使用 nc 来接受 shell
nc 监听
接收回弹