组策略之LAPS

组策略之Local Administrator Password Solution

0x00 LAPS介绍

介绍:

将本地管理员密码存储在LDAP上,作为计算机账户的一个机密属性,配合GPO,实现自动定期修改密码、设置密码长度、强度等,然后配置某些指的账号,能查看存储的密码,
如果用户需要,可以用PowerShell或指的工具查询密码,但对非授权用户,确无法获取,从而实现本机管理员的自动化管理。
LAPS使用两个LDAP属性来存储本地管理员凭证,这两个属性分别是ms-MCS-AdmPwd(存储密码)和ms-MCS-AdmPwdExpirationTime(存储过期时间)。

功能:

如果配置不当,我们可以在域内一台普通主机,查看域内其他主机本地管理员账号
LAPS解决方案的核心是GPO客户端扩展(CSE),它执行以下任务,并可以在GPO更新期间执行以下操作:
检查本地Administrator帐户的密码是否已过期。
当旧密码过期或需要在过期之前进行更改时,生成新密码。
根据密码策略验证新密码。
将密码报告给Active Directory,并将密码和机密属性一起存储在Active Directory中。
将密码的下一个到期时间报告给Active Directory,并将该属性与计算机帐户的属性一起存储在Active Directory中。
更改管理员帐户的密码。
然后,允许这样做的用户可以从Active Directory中读取密码。合格的用户可以请求更改计算机的密码。
计算机帐户只能写入/更新自己的本地管理员帐户密码(ms-Mcs-AdmPwd属性),而不能从该属性读取密码。
可以轻松地为OU中的每台计算机更改密码。

展示:

laps再ldap的属性里:
      ms-MCS-AdmPwd:存储密码
      ms-MCS-AdmPwdExpirationTime:存储过期时间

靶场环境介绍:

测试环境:
组织 OU:lapsComputers
            MOTOO-IISWEB$           域机器
组织 OU:lapsAdminUsers
            lidan                   域用户
组 group: lapsAdmins
            lidan                   用户

0x01 域控创建组织lapsComputers和laspAdminUsers

创建组织OU

img

img

img

成功将Motoo-IISWEB域机器加入到lapsComputers组织里

img

img

同样创建组织OU:lapsAdminUsers

创建组:lapsAdmins

将liidan域用户加入到组织OU:lapsAdminUsers里,并且加入到组lapsAdmins

img

通过net user lidan /do可以看到在lapsAdmins组里

img

0x02 安装LAPS

域控安装laps

img

img

扩展AD的架构

windows2008 的powershell版本是2.0,需要更新到3.0。才能导入Admpwd.ps

Import-module AdmPwd.PS
Update-AdmPwdADSchema

使用Update-AdmPwdADSchema扩展架构

img

从活动目录中可以看到多出了这两个属性

img

查询lapsComputers这个OU的访问权限,可以看到目前只有域机器system权限和域管可以访问

Find-AdmPwdExtendedRights -Identity lapsComputers | Format-Table -AutoSize
Find-AdmPwdExtendedRights -Identity "OU=lapsComputers,DC=Motoo,DC=nc" | Format-Table -AutoSize

img

img

使用以下命令授予计算机修改本机ms-Mcs-AdmPwdExpirationTime 和 ms-Mcs-AdmPwd这两个扩展属性的权限。

Set-AdmPwdComputerSelfPermission -OrgUnit lapsComputers

img

使用以下命令设置读取组织lapsComputers里的计算机扩展属性的权限组为lapsAdmins

Set-AdmPwdReadPasswordPermission -OrgUnit lapsComputers -AllowedPrincipals lapsAdmins

img

可以看到成功多了Motoo\lapsAdmins组

img

使用以下命令设置重置密码的权限组为LAPAdmins

Set-AdmPwdResetPasswordPermission -OrgUnit lapsComputers -AllowedPrincipals lapsAdmins

img

img

0x03 创建两条组策略链接到创建的OU上

lapsAdminUsers组织创建组策略install laps           目的:当lapsAdminUsers组织里的域用户登录时,通过组策略安装laps
lapsComputers组织创建组策略set laps                目的:当域用户登陆后成功安装了laps后,通过组策略自动修改本地管理员密码

打开域组策略gpmc.msc,启动组策略管理控制台,右键单击该域,然后单击“ 在此域中创建 GPO并在此处链接”。为GPO提供一个名称。

0x03-1 lapsAdminUsers组织创建组策略install laps

在lapsAdminUsers的组织里新建一个组策略

img

img

同时在\Motoo.nc\SYSVOL\Motoo.nc\Policies路径下多了该文件夹

img

将laps安装包放到该文件夹下的Machine

img

编辑组策略install laps

img

选择安装包

img

安装包只能是msi

img

选择指派

img

成功指向共享文件里的msi安装包

img

当域用户登录桌面的时候,就会自动安装。如果已经安装过了则不会再安装了。

img

0x03-2 lapsComputers组织创建组策略set laps

img

img

密码的设置,提供了多种复杂度的组合方式、密码长度和密码重置周期的设置。

img

接下来是输入本地管理员的用户名,如果你修改的不是内置的Administrator,请在这里指定你希望修改的用户名,在未配置的情况下默认为内置的Administrator。

img

接下来这一项是为了重置周期与密码有效期策略配合使用的设置。因为很多公司都有自己的密码过期策略,启用这一项可以避免两个配置发生冲突。

img

最后一项启用配置后确认对本地管理员密码开始进行设置。

img

0x04 通过ldap查看laps的明文密码

使用lapsAdminUsers组织里的lapsAdmins组里的成员lidan登录lapsComputers机器

可以看到登陆的时候显示正在安装laps

img

通过lidan域用户或者域管用户查看ldap,选择lapsComputers里的域机器,可以看到本地管理员administrator的随机明文密码

img

如果使用非lapsAdminsUsers组织lapsAdmins组里的域用户查看ldap,是看不到的密码的,只能看到是什么时候修改的

img

0x05 漏洞利用

0x05-1 grouper2 导出组策略

当我们遇到域环境时,先通过grouper2导出组策略看是否有laps

Grouper2.exe -d Motoo.nc -u liwei -p 1qaz@WSX -t 100 -f out.html

img

打开out.html,全局搜索laps

img

通过uid可以找到laps链接到哪个组织

img

0x05-2 LAPSTOOlkit工具寻找laps漏洞

github : https://github.com/leoloobeek/LAPSToolkit/archive/master.zip
显示全部启用了LAPS和密码扩展的计算机设备。
get-help Get-LAPSComputers
查询所有的OU并检测哪一个活动目录组可读取ms-Mcs-AdmPwd属性。
get-help Find-LAPSDelegatedGroups       使用了get-NetOU
针对每一个启用了LAPS的活动目录计算机,进行扩展权限分析,并查找哪一个用户组拥有AD读取权限,以及其中的用户是否具有“全部扩展权限”。系统管理员可能不知道哪一个具有“全部扩展权限”的用户可以查看密码,以及用户组中的哪一个用户安全等级比较低。这个功能可以针对每一个AD设备解析ACL权限,但对于范围比较大的域,解析时间会比较久。
get-help Find-AdmPwdExtendedRights      使用了get-objectAcl
原理
​```
Get-NetComputer -ComputerName 'LAPSCLIENT.test.local' -FullData |
Select-Object -ExpandProperty distinguishedname |
ForEach-Object { $_.substring($_.indexof('OU')) } | ForEach-Object {
  Get-ObjectAcl -ResolveGUIDs -DistinguishedName $_
} | Where-Object {
  ($_.ObjectType -like 'ms-Mcs-AdmPwd') -and
  ($_.ActiveDirectoryRights -match 'ReadProperty')
} | ForEach-Object {
  Convert-NameToSid $_.IdentityReference
} | Select-Object -ExpandProperty SID | Get-ADObject
​```
首先,我们将获取Get-NetComputer -FullData的完整数据对象。然后,我们提取并扩展 distinguishedname属性,找到“ OU”的索引,然后仅返回字符串的该部分。我们在这里所做的只是枚举特定计算机所属的OU。
接下来,我们使用Get-ObjectAcl枚举该指定OU的ACL, 并使用-ResolveGUIDs将GUID解析为通用显示名称。然后,我们过滤权限条目,仅返回那些在ms-Mcs-AdmPwd字段上包含读取权限的条目 。我们无法确定从IdentityReference字段返回的名称 是组还是用户,因此我们可以使用PowerView的 Convert-NameToSid cmdlet将对象转换为直接安全标识符(SID),然后将其最终传递给 Get -ADObject返回具有对该字段的读取权限的完整活动目录用户/组对象。从结果中我们可以看到,“ LAPS_recover”域组被授予读取权限。
现在,如果我们想枚举所有LAPS应用程序,并且谁拥有对它们的读取权限,该怎么办?由于最近对Get-ObjectACL的参数流水线进行了一些优化,因此比以往任何时候都更容易
​```
Get-NetOU -FullData | 
Get-ObjectAcl -ResolveGUIDs | 
Where-Object {
  ($_.ObjectType -like 'ms-Mcs-AdmPwd') -and 
  ($_.ActiveDirectoryRights -match 'ReadProperty')
} | ForEach-Object {
  $_ | Add-Member NoteProperty 'IdentitySID' $(Convert-NameToSid $_.IdentityReference).SID;
  $_
}
​```

查询哪些机器使用了laps

Get-LAPSComputers

img

查询所有的OU并检测哪一个活动目录组可读取ms-Mcs-AdmPwd属性。

import-module .\LAPSToolkit.ps1
Find-LAPSDelegatedGroups

img

从上图结果得知,lapsAdmins组里的用户可以读取lapsComputers组织里的所有域机器的本地管理员密码

参考链接

http://drops.xmd5.com/static/drops/tips-10496.html
http://tech.canway.net/news/164.html
http://www.harmj0y.net/blog/powershell/running-laps-with-powerview/

   转载规则


《组策略之LAPS》 ske 采用 知识共享署名 4.0 国际许可协议 进行许可。