> For the complete documentation index, see [llms.txt](https://books.spartan-cybersec.com/cpna/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://books.spartan-cybersec.com/cpna/tecnicas-ofensivas-contra-ec2/vectores-de-escalacion-de-privilegios/passexistingroletonewgluedevendpoint.md).

# PassExistingRoleToNewGlueDevEndpoint

{% hint style="danger" %}
¿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](https://spartan-cybersec.com/cursos/pentesting-contra-la-nube-de-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.
{% endhint %}

{% hint style="warning" %}
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>
{% endhint %}

Un atacante con los permisos `iam:PassRole` y `glue:CreateDevEndpoint` podría crear un nuevo punto de enlace de desarrollo de AWS Glue y pasarle un rol de servicio existente.

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

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FECteezfosRPrYVsbYmEs%2Fimage.png?alt=media&amp;token=0d8fc304-fd2f-4a1a-9a6f-3de652044cc5" alt=""><figcaption></figcaption></figure>

Este usuario tiene la siguiente política:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FAZIF1Vh0JplKxXTZHRZD%2Fimage.png?alt=media&amp;token=50ca1ced-a898-4773-b189-043738757719" alt=""><figcaption></figcaption></figure>

Este usuario tiene el siguiente rol:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F1XNOmF5IvS1mZpcUSbe9%2Fimage.png?alt=media&amp;token=09089929-a9b6-4628-81e7-720211cfb22e" alt=""><figcaption></figcaption></figure>

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

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

{% code overflow="wrap" %}

```
aws iam list-attached-user-policies --user-name privesc18-PassExistingRoleToNewGlueDevEndpoint-user
```

{% endcode %}

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F4s59UhYOk5sgKWiiKU4L%2Fimage.png?alt=media&amp;token=e1c676d2-ac63-46b0-8540-cde963072bf6" alt=""><figcaption></figcaption></figure>

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

{% code overflow="wrap" %}

```
aws iam get-policy-version --policy-arn arn:aws:iam::037572360634:policy/privesc18-PassExistingRoleToNewGlueDevEndpoint --version-id v1
```

{% endcode %}

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FV0nivOwGVGomd3dtnbLP%2Fimage.png?alt=media&amp;token=732d3a10-518d-410d-843b-905b40e4a2e6" alt=""><figcaption></figcaption></figure>

Para este escenario estaremos utilizando el siguiente rol:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FCl9imL0a4shQfVfhGtO5%2Fimage.png?alt=media&amp;token=e90fc806-de30-40a1-9995-d2a194b473a1" alt=""><figcaption></figcaption></figure>

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

Para este laboratorio, debemos crear un par de llaves SSH.

Nosotros realizaremos este escenario desde un equipo Linux por cuestiones de agilidad:

Para la creación de una llave privada y pública de SSH, tenemos que ejecutar lo siguiente:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F4juC1ZOI4Uu6Laoa1A86%2Fimage.png?alt=media&amp;token=cef23a83-c433-43a6-a6c4-ac4153250ee3" alt=""><figcaption></figcaption></figure>

Estas claves de SSH, serán necesarias para la ejecución de los comandos posteriores.

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

{% code overflow="wrap" %}

```
aws sts assume-role --role-arn arn:aws:iam::037572360634:role/privesc18-PassExistingRoleToNewGlueDevEndpoint-role --role-session-name privesc18
```

{% endcode %}

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FSeL0gd7IsAzEGtdZ4keL%2Fimage.png?alt=media&amp;token=27de8249-105f-4fa9-badf-eab51a6065ae" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
A partir de este momento, estaremos trabajando con el usuario <mark style="color:red;">**privesc3-CreateEC2WithExistingInstanceProfile-user**</mark>.

Todos los comandos posteriores deben tener especificado el `--profile` con su respectivo nombre de perfil.
{% endhint %}

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

```
aws configure --profile privesc18
```

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FRrFkSIhDPyFJ579l9725%2Fimage.png?alt=media&amp;token=335e029e-ab6f-4beb-a957-7a4c87c2405e" alt=""><figcaption></figcaption></figure>

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

```
aws sts get-caller-identity --profile privesc18
```

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F9FzxNy84WGz4baXJGiBH%2Fimage.png?alt=media&amp;token=261961ba-00e3-457e-ae4e-f7903c6e982a" alt=""><figcaption></figcaption></figure>

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

{% code overflow="wrap" %}

```
aws iam add-user-to-group --group-name Group-Root-Spartan --user-name privesc18-PassExistingRoleToNewGlueDevEndpoint-user --profile privesc18
```

{% endcode %}

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FKFryUrltwhr1GhptgJTz%2Fimage.png?alt=media&amp;token=fbb8cd85-2dbf-4004-af5d-56bb7c16b763" alt=""><figcaption></figcaption></figure>

En este escenario, tenemos que aprovechar del privilegio de `glue:CreateDevEndpoint` para crear un punto de enlace de desarrollo en AWS Glue y este será creado utilizando un rol administrativo.

Posteriormente, utilizaremos el permiso `glue:GetDevEndpoint` para visualizar el hostname del equipo y posteriormente conectarnos por SSH con nuestra llave privada.

Ahora procedemos a crear un endpoint de desarrollo con el siguiente comando:

{% code overflow="wrap" %}

```
aws glue create-dev-endpoint --endpoint-name privesctest --role-arn arn:aws:iam::037572360634:role/privesc-high-priv-service-role --public-key file:///home/hacker/.ssh/id_rsa.pub --profile privesc18
```

{% endcode %}

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FfMoE8GtM89WxhnpaWRfE%2Fimage.png?alt=media&amp;token=b1baa6fd-08ad-4d77-8274-b4a1a5050f45" alt=""><figcaption></figcaption></figure>

En la evidencia previa, podemos apreciar el parámetro llamado public-key y en él se debe especificar la ruta en donde se aloja nuestra llave publica de SSH.

Ahora que hemos creado nuestro endpoint de desarrollo vamos aprovechar nuestro otro privilegio de `glue:GetDevEndpoint` para visualizar el PublicAddress y luego conectarnos con SSH.

Es importante mencionar, que la creación del enpoint de desarrollo toma unos minutos para ser creado y esto puede ser validado con el valor del objeto Status que retorna el próximo comando.

Si el valor de Status es igual a <mark style="color:orange;">PROVISIONING</mark> es porque aún no se ha creado totalmente el endpoint de desarrollo y debemos esperar un par de minutos más. Sin embargo, si su valor es <mark style="color:orange;">READY</mark> es porque ya podremos continuar con nuestra intrusión.

El comando para retornar información sobre el enpoint recién creado es:

```
aws glue get-dev-endpoint --endpoint-name privesctest --profile privesc18
```

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2Fsaf1xZCVhKYO57re9p6i%2Fimage.png?alt=media&amp;token=a1727588-88e4-4ad7-882e-316df199e44a" alt=""><figcaption></figcaption></figure>

Ahora tomamos el valor del PublicAddress y ejecutamos el siguiente comando:

{% code overflow="wrap" %}

```
ssh glue@ec2-18-119-9-156.us-east-2.compute.amazonaws.com -i /home/hacker/.ssh/id_rsa
```

{% endcode %}

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2Fd5d1aY4QNkRL4RoKToOe%2Fimage.png?alt=media&amp;token=956de8e4-b789-46fd-9af9-eb5b27bb3fc1" alt=""><figcaption></figcaption></figure>

Después de la conexión con SSH contra el endpoint de desarrollo de Glue, vamos a realizar una petición contra el servicio de metadatos con el objetivo de obtener unas claves de STS sobre el rol que especificamos en la creación del enpoint.

```
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy
```

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F0knyJdJGTtzrmpWgQFfV%2Fimage.png?alt=media&amp;token=a00d5ae2-656c-4163-95c0-8e81b7a5da7b" alt=""><figcaption></figcaption></figure>

En la evidencia previa, podemos identificar el AccessKeyId, SecretAccessKey y Token del rol llamado <mark style="color:orange;">**privesc-high-priv-service-role**</mark>.

Vamos a autenticarnos con estas credenciales en otra consola y validaremos nuestros permisos:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F9LhLIkr5csxwqxcmSj43%2Fimage.png?alt=media&amp;token=c0513254-1d1d-410b-b351-fa45f222e173" alt=""><figcaption></figcaption></figure>

Ahora procedemos a añadir nuestro usuario inicial al grupo de administradores con el objetivo de realizar una persistencia y elevar los permisos de nuestro usuario.

El comando para añadir a un usuario en un grupo es el siguiente:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2F9lPJgOeBO28G1hJqaOJQ%2Fimage.png?alt=media&amp;token=39e5b198-05ce-4153-8601-c0f943c75e6c" alt=""><figcaption></figcaption></figure>

Para finalizar, vamos a validar los permisos para el grupo en el que hemos añadido a nuestro usuario inicial:

<figure><img src="https://1420718843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjUr7ifmUiydm8bW32KgO%2Fuploads%2FBNZGWtb8u9kibABGg8zT%2Fimage.png?alt=media&amp;token=6e442d9b-ea3e-4cb9-a0c3-2a3822e9bb9b" alt=""><figcaption></figcaption></figure>

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

> Nota: Los permisos `glue:GetDevEndpoint` y `glue:GetDevEndpoints` hacen lo mismo, excepto que `glue:GetDevEndpoints` devuelve todos los Endpoints. Cualquier de los dos permisos funciona para esta técnica de escalada de privilegios.
