Az - PostgreSQL Privesc

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

PostgreSQL Privesc

Para más información sobre SQL Database, consulta:

Az - PostgreSQL

Microsoft.DBforPostgreSQL/flexibleServers/read && Microsoft.DBforPostgreSQL/flexibleServers/write

Con este permiso, puedes crear, actualizar o eliminar instancias de PostgreSQL Flexible Server en Azure. Esto incluye aprovisionar nuevos servidores, modificar configuraciones de servidores existentes o desmantelar servidores.

az postgres flexible-server create \
--name <ServerName> \
--resource-group <ResourceGroupName> \
--location <Location> \
--admin-user <AdminUsername> \
--admin-password <AdminPassword> \
--sku-name <SkuName> \
--storage-size <StorageSizeInGB> \
--tier <PricingTier> \
--version <PostgreSQLVersion>

Por ejemplo, estos permisos permiten cambiar la contraseña de PostgreSQL, útil por supuesto en caso de que la autenticación de PostgreSQL esté habilitada.

az postgres flexible-server update \
--resource-group <resource_group_name> \
--name <server_name> \
--admin-password <password_to_update>

Además, con los permisos puedes habilitar la identidad asignada, y operar con la identidad administrada adjunta al servidor. Aquí puedes encontrar todas las extensiones que el servidor flexible de Azure PostgreSQL soporta https://learn.microsoft.com/en-us/azure/cosmos-db/postgresql/reference-extensions. Para poder usar estas extensiones, algunos parámetros del servidor (azure.extensions) necesitan ser cambiados. Por ejemplo, aquí con una identidad administrada que puede acceder a Azure Storage:

Primero cambiamos los parámetros y nos aseguramos de que la identidad asignada esté habilitada:

az postgres flexible-server parameter set \
--resource-group <YourResourceGroupName> \
--server-name <YourServerName> \
--name azure.extensions \
--value "AZURE_STORAGE"

az postgres flexible-server identity update \
--resource-group <YourResourceGroupName> \
--server-name <YourServerName> \
--system-assigned Enabled

CREATE EXTENSION IF NOT EXISTS azure_storage;

CREATE EXTERNAL DATA SOURCE ManagedIdentity

SELECT azure_storage.account_add('<storage-account>', '<storage-key>');

SELECT *
FROM azure_storage.blob_get(
'<storage-account>',
'<container>',
'message.txt',
decoder := 'text'
) AS t(content text)
LIMIT 1;

Además, es necesario tener habilitado el acceso público si deseas acceder desde un endpoint no privado. Para habilitarlo:

az postgres flexible-server update --resource-group <resource_group_name> --server-name <server_name> --public-access Enabled

Microsoft.DBforPostgreSQL/flexibleServers/read, Microsoft.DBforPostgreSQL/flexibleServers/write, Microsoft.DBforPostgreSQL/flexibleServers/backups/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action

Con estos permisos puedes restaurar un servidor desde una copia de seguridad con:

az postgres flexible-server restore \
--resource-group <RESOURCE_GROUP> \
--name <NEW_SERVER_NAME> \
--source-server <SOURCE_SERVER_NAME> \
--restore-time "<ISO8601_TIMESTAMP>" \
--yes

Microsoft.DBforPostgreSQL/flexibleServers/read, Microsoft.DBforPostgreSQL/flexibleServers/write, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action, Microsoft.DBforPostgreSQL/flexibleServers/administrators/write && Microsoft.DBforPostgreSQL/flexibleServers/administrators/read

Con este permiso, puedes configurar administradores de Azure Active Directory (AD) para un Servidor Flexible de PostgreSQL. Esto se puede explotar configurando a uno mismo u otra cuenta como el administrador de AD, otorgando control administrativo total sobre el servidor de PostgreSQL. La actualización de un principal existente aún no es compatible, por lo que si hay uno creado, debes eliminarlo primero.

Es importante que el servidor flexible tenga identidades administradas asignadas a un usuario para usar.

az postgres flexible-server ad-admin create \
--resource-group <ResourceGroupName> \
--server-name <ServerName> \
--display-name <ADAdminDisplayName> \
--identity <IdentityNameOrID> \
--object-id <ObjectID>

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks