> 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="/files/21aKA7zITSkCfsOWY2ED" alt=""><figcaption></figcaption></figure>

Este usuario tiene la siguiente política:

<figure><img src="/files/x3iUGlVHPnHhhxyTa70v" alt=""><figcaption></figcaption></figure>

Este usuario tiene el siguiente rol:

<figure><img src="/files/kBS1yyxzniu1YFND96QO" 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="/files/D8y7NA7DVSWZ1VG2R6oj" 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="/files/Ss5UWDJxQqi80seyIaWS" alt=""><figcaption></figcaption></figure>

Para este escenario estaremos utilizando el siguiente rol:

<figure><img src="/files/tHoexmAuSpPvnOfiuRgs" 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="/files/K1VFV5kLy2vjC9BwTCeT" 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="/files/wHeN13spBQxSLMfHnmB2" 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="/files/N7cvK7yiuhk5MRGP8Vsn" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="/files/4kHnFNmF9YFkeFRIf9gf" 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="/files/drH8wLtvEDU7okCaemq7" 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="/files/gWmUX46pgRQIs0oaJhDS" 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="/files/bVNvKKCqjCOMjO5aec8S" 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="/files/74HN6kTHHNNNHF7onQWZ" 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="/files/vUdWn870sTCGkToPBMUf" 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="/files/qZ2VYU4yjD7rFeoYFXTp" 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="/files/HEF76hkZirbJshustHo9" 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="/files/gbUaKV7WAeg2te4bWwO6" 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.
