组策略之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
成功将Motoo-IISWEB域机器加入到lapsComputers组织里
同样创建组织OU:lapsAdminUsers
创建组:lapsAdmins
将liidan域用户加入到组织OU:lapsAdminUsers里,并且加入到组lapsAdmins
通过net user lidan /do可以看到在lapsAdmins组里
0x02 安装LAPS
域控安装laps
扩展AD的架构
windows2008 的powershell版本是2.0,需要更新到3.0。才能导入Admpwd.ps
Import-module AdmPwd.PS
Update-AdmPwdADSchema
使用Update-AdmPwdADSchema扩展架构
从活动目录中可以看到多出了这两个属性
查询lapsComputers这个OU的访问权限,可以看到目前只有域机器system权限和域管可以访问
Find-AdmPwdExtendedRights -Identity lapsComputers | Format-Table -AutoSize
Find-AdmPwdExtendedRights -Identity "OU=lapsComputers,DC=Motoo,DC=nc" | Format-Table -AutoSize
使用以下命令授予计算机修改本机ms-Mcs-AdmPwdExpirationTime 和 ms-Mcs-AdmPwd这两个扩展属性的权限。
Set-AdmPwdComputerSelfPermission -OrgUnit lapsComputers
使用以下命令设置读取组织lapsComputers里的计算机扩展属性的权限组为lapsAdmins
Set-AdmPwdReadPasswordPermission -OrgUnit lapsComputers -AllowedPrincipals lapsAdmins
可以看到成功多了Motoo\lapsAdmins组
使用以下命令设置重置密码的权限组为LAPAdmins
Set-AdmPwdResetPasswordPermission -OrgUnit lapsComputers -AllowedPrincipals lapsAdmins
0x03 创建两条组策略链接到创建的OU上
lapsAdminUsers组织创建组策略install laps 目的:当lapsAdminUsers组织里的域用户登录时,通过组策略安装laps
lapsComputers组织创建组策略set laps 目的:当域用户登陆后成功安装了laps后,通过组策略自动修改本地管理员密码
打开域组策略gpmc.msc,启动组策略管理控制台,右键单击该域,然后单击“ 在此域中创建 GPO并在此处链接”。为GPO提供一个名称。
0x03-1 lapsAdminUsers组织创建组策略install laps
在lapsAdminUsers的组织里新建一个组策略
同时在\Motoo.nc\SYSVOL\Motoo.nc\Policies路径下多了该文件夹
将laps安装包放到该文件夹下的Machine
编辑组策略install laps
选择安装包
安装包只能是msi
选择指派
成功指向共享文件里的msi安装包
当域用户登录桌面的时候,就会自动安装。如果已经安装过了则不会再安装了。
0x03-2 lapsComputers组织创建组策略set laps
密码的设置,提供了多种复杂度的组合方式、密码长度和密码重置周期的设置。
接下来是输入本地管理员的用户名,如果你修改的不是内置的Administrator,请在这里指定你希望修改的用户名,在未配置的情况下默认为内置的Administrator。
接下来这一项是为了重置周期与密码有效期策略配合使用的设置。因为很多公司都有自己的密码过期策略,启用这一项可以避免两个配置发生冲突。
最后一项启用配置后确认对本地管理员密码开始进行设置。
0x04 通过ldap查看laps的明文密码
使用lapsAdminUsers组织里的lapsAdmins组里的成员lidan登录lapsComputers机器
可以看到登陆的时候显示正在安装laps
通过lidan域用户或者域管用户查看ldap,选择lapsComputers里的域机器,可以看到本地管理员administrator的随机明文密码
如果使用非lapsAdminsUsers组织lapsAdmins组里的域用户查看ldap,是看不到的密码的,只能看到是什么时候修改的
0x05 漏洞利用
0x05-1 grouper2 导出组策略
当我们遇到域环境时,先通过grouper2导出组策略看是否有laps
Grouper2.exe -d Motoo.nc -u liwei -p 1qaz@WSX -t 100 -f out.html
打开out.html,全局搜索laps
通过uid可以找到laps链接到哪个组织
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
查询所有的OU并检测哪一个活动目录组可读取ms-Mcs-AdmPwd属性。
import-module .\LAPSToolkit.ps1
Find-LAPSDelegatedGroups
从上图结果得知,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/