# Az Cli

## <mark style="background-color:red;">Instalación</mark>

<mark style="background-color:red;">Windows</mark>

Detalles de la instalación: <https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-windows?tabs=powershell>

O también se puede utilizar el siguiente comando que descarga y ejecuta el instalador .msi de 64-bit:

{% code overflow="wrap" %}

```powershell
$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest -Uri https://aka.ms/installazurecliwindowsx64 -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; Remove-Item .\AzureCLI.msi
```

{% endcode %}

### Linux

<https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux?view=azure-cli-latest&pivots=apt>

```bash
sudo apt install azure-cli
```

## <mark style="background-color:red;">Conexión</mark>

Para iniciar sesión con Az Cli, se pueden usar los siguientes comandos:

### <mark style="color:red;">Popup</mark>

Se abre una ventana emergente para iniciar sesión:

```powershell
az login
```

### <mark style="color:red;">Línea de comandos</mark>

Se inicia sesión desde la línea de comandos.

* Se registra la contraseña en el historial de la consola:

```powershell
az login -u <email> -p <password>
```

* No se registra la contraseña en el historial de la consola:

```powershell
az login -u <email>
```

```powershell
read -sp "Azure password: " AZ_PASS && echo && az login -u <username> -p $AZ_PASS
```

```powershell
$AzCred = Get-Credential -UserName <username>
az login -u $AzCred.UserName -p $AzCred.GetNetworkCredential().Password
```

#### Sin permisos en suscripciones

```powershell
az login -u <email> -p <password> --allow-no-subscriptions
```

#### Con código de dispositivo

Si se quiere iniciar sesión sin el popup o usando credenciales desde la consola, se puede usar el siguiente comando, que dará un código para usarlo desde un positivo en el que se haya iniciado sesión.

1. Se ejecuta el comando y se obtiene un código:

```powershell
az login --use-device-code
```

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

2. Se abre la url "<https://microsoft.com/devicelogin>" en un dispositivo donde se haya iniciado sesión.
3. Se añade el código mostrado en el paso 1.

## <mark style="background-color:red;">Tokens</mark>

* Obtener token de acceso:

```powershell
az account get-access-token
az account get-access-token --resource-type aad-graph
az account get-access-token --subscription "<subscription ID or name>"
```

## <mark style="background-color:red;">Configuración</mark>

```powershell
az configure
```

## <mark style="background-color:red;">Comandos</mark>

```
az find "vm"
az find "az vm"
az find "az vm list"
```

{% hint style="info" %}
Se puede modificar la salida de información con el parámetro "--output":

* \--output table
  {% endhint %}

{% hint style="warning" %}
Para obtener información de la mayoría de consultas, es necesario que el dispositivo se encuentre dentro del dominio, si no, saldrá el siguiente error:

{% code overflow="wrap" fullWidth="false" %}

```
AADSTS53001: Device is not in required device state: domain_joined. Conditional Access policy requires a domain joined device, and the device is not domain joined. Trace ID: 65ee476e-caa8-4fff-b8fc-351f6e947101 Correlation ID: ca37e804-ed92-4f9e-bf70-44895e9e6ca0 Timestamp: 2024-04-28 18:10:57Z
```

{% endcode %}
{% endhint %}

## <mark style="background-color:red;">Información general</mark>

* Detalles del Tenant:

```powershell
az account tenant list
```

* Obtener detalles de la subscripción actual:

<pre class="language-powershell"><code class="lang-powershell"><strong>az account subscription list
</strong></code></pre>

* Obtener detalles del usuario actual:

```powershell
az ad signed-in-user show
```

* Obtener los objetos propiedad del usuario actual:

```
az ad signed-in-user list-owned-objects
```

* Obtener las máquinas virtuales donde el usuario actual tiene al menos permisos de lectura:

```powershell
az vm list
```

* Obtener nombre de las máquinas virtuales:

```powershell
az vm list --query "[].[name]" -o table
```

## <mark style="background-color:red;">Usuarios</mark>

* Obtener usuarios:

```powershell
az ad user list
```

{% hint style="info" %}
Esta herramienta utiliza JMESPath como consulta para filtrar información.
{% endhint %}

* Filtrar la salida para mostrar únicamente *userPrincipalName* y *displayName*:

```powershell
az ad user list --query "[].[userPrincipalName,displayName]" --output table
```

* Filtrar la salida para mostrar las columnas anteriores modificando el nombre de la columna:

```powershell
az ad user list --query "[].{UPN:userPrincipalName, Name:displayName}" --output table
```

* Obtener detalles de un usuario en concreto:

```powershell
az ad user show --id test@defcorphq.onmicrosoft.com
```

* Obtener los usuarios cuyo *displayName* contenga la cadena *admin (case sensitive)*:

```powershell
az ad user list --query "[?contains(displayName,'admin')].displayName"
```

* Lo mismo que antes, pero *NOT case sensitive*:

```powershell
az ad user list | ConvertFrom-Json | %{$_.displayName -match "admin"}
```

* Todos los usuarios sincronizados desde on-prem:

```powershell
az ad user list --query "[?onPremisesSecurityIdentifier!=null].displayName"
```

* Usuarios que son de AzureAD:

```powershell
az ad user list --query "[?onPremisesSecurityIdentifier==null].displayName"
```

* Para ver más opciones de filtrado:

```powershell
az ad user show list --query-examples
```

## <mark style="background-color:red;">Grupos</mark>

* Obtener todos los grupos:

```powershell
az ad group list

az ad group list --query "[].[displayName]" -o table
```

* Obtener un grupo en concreto según su *DisplayName* u *ObjectID*:

```powershell
az ad group show -g "VM Admins"

az ad group show -g fe5e6dcb-1c46-2abe-b964-9af5ba122494
```

* Obtener los grupos que contengan en el DisplayName una cadena en concreto (*case sensitive*):

```powershell
az ad group list --query "[?contains(displayName,'admin')].displayName"
```

* Obtener los grupos que contengan en el DisplayName una cadena en concreto (NOT *case sensitive*):

```powershell
az ad group list | ConvertFrom-Json | %{$_.displayName -match "admin"}
```

* Obtener los grupos sincronizados desde on-prem:

```powershell
az ad group list --query "[?onPremisesSecurityIdentifier!=null].displayName"
```

* Obtener los grupos de AzureAD:

```powershell
az ad group list --query "[?onPremisesSecurityIdentifier==null].displayName"
```

* Obtener miembros de un grupo:

{% code overflow="wrap" %}

```
az ad group member list -g "VM Admins" --query "[].[displayName]" -o table
```

{% endcode %}

* Comprobar si un usuario es miembro de un grupo:

{% code overflow="wrap" %}

```powershell
az ad group member check --group "VM Admins" --member-id fe4e6dcb-1c46-2abe-b964-9af5ba322494
```

{% endcode %}

* Obtener los ObjectID de los grupos a los que pertenece el grupo:

{% code overflow="wrap" %}

```powershell
az ad group get-member-groups -g "VM Admins"
```

{% endcode %}

* Añadir un usuario a un grupo usando sus ObjectID:

{% code overflow="wrap" %}

```powershell
Add-AzureADGroupMember -ObjectId "<ID del grupo>" -RefObjectId "<ID del usuario>" -Verbose
```

{% endcode %}

```powershell
Add-AzureADGroupMember -ObjectId "e6875783-1378-4072-b242-
84c08c6dc0d7" -RefObjectId "f63e133c-bd01-4b1b-b3b7-7cd949fd45f3" -Verbose
```

## <mark style="background-color:red;">Aplicaciones</mark>

* Obtener todas las aplicaciones registradas en el Tenant:

{% code overflow="wrap" %}

```powershell
az ad app list

az ad app list --query "[].[displayName]" -o table
```

{% endcode %}

* Obtener todos los detalles de una aplicación:

```powershell
az ad app show --id fe4e6dcb-1c45-2abe-b964-9af5ba322494
```

* Obtener una aplicación basado en su *DisplayName*:

```powershell
az ad app list --query "[?contains(displayName,'app')].displayName"
```

* Obtener una aplicación que contenga una cadena en concreto en el DisplayName:

```powershell
az ad app list | ConvertFrom-Json | %{$_.displayName -match "app"}
```

* Obtener al dueño/a de una aplicación:

{% code overflow="wrap" %}

```powershell
az ad app owner list --id fe4e6dcb-1c45-2abe-b964-9af5ba321494 --query "[].[displayName]" -o table
```

{% endcode %}

* Obtener las aplicaciones que cuentan con contraseña:

```powershell
az ad app list --query "[?passwordCredentials !=null].displayName"
```

* Obtener las aplicaciones que tienen claves de credenciales (usan certificados de autenticación):

```powershell
az ad app list --query "[?keyCredentials !=null].displayName"
```

* Obtener aplicaciones web:

```powershell
az webapp list
```

* Obtener aplicaciones de funciones de Azure:

```powershell
az functionapp list
```

## <mark style="background-color:purple;">Servicios principales</mark>

* Obtener todos los *Service Principals*:

```powershell
az ad sp list --all
az ad sp list --all --query "[].[displayName]" -o table
```

* Obtener los detalles de un *Service Principal* según su *DisplayName* u *ObjectID*:

```powershell
az ad sp show --id fe4e6dcb-1c45-1abe-b964-9af5ba321494
```

* Obtener un *Service Principal* cuyo *DisplayName* empiece por la cadena en concreto :

{% code overflow="wrap" %}

```powershell
az ad sp list --all --query "[?contains(displayName,'app')].displayName"
```

{% endcode %}

* Obtener un *Service Principal* que contenga una cadena en concreto en su *DisplayName*:

{% code overflow="wrap" %}

```powershell
az ad sp list --all | ConvertFrom-Json | %{$_.displayName -match "app"}
```

{% endcode %}

* Obtener al dueño/a de un *Service Principal*:

{% code overflow="wrap" %}

```powershell
az ad sp owner list --id fe4e6dcb-1c45-1abe-b964-9af5ba321494 --query "[].[displayName]" -o table
```

{% endcode %}

* Obtener los *Service Principals* cuyo dueño/a es el usuario actual:

```powershell
az ad sp list --show-mine
```

* Obtener los *Service Principals* que cuentan con contraseña:

```powershell
az ad sp list --all --query "[?passwordCredentials != null].displayName"
```

* Obtener los *Service Principals* que tienen claves de credenciales (usan certificados de autenticación):

```powershell
az ad sp list -all --query "[?keyCredentials != null].displayName"
```

## <mark style="background-color:red;">Roles</mark>

```powershell
az role assignment list --assignee xtormin@xtormincorp.onmicrosoft.com
```

## <mark style="background-color:red;">Referencias</mark>

* <https://learn.microsoft.com/en-us/cli/azure/authenticate-azure-cli-interactively>
* <https://learn.microsoft.com/en-us/cli/azure/cheat-sheet-onboarding>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.xtormin.com/pentesting-en-infraestructuras/cloud/azure/metodologia-de-azure-pentest/reconocimiento-interno/enum-con-herramientas-de-ms/az-cli.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
