Translated ['src/pentesting-cloud/azure-security/az-services/az-azuread.

This commit is contained in:
Translator
2025-02-09 17:54:03 +00:00
parent 2a45d020d5
commit 635345e02b

View File

@@ -4,7 +4,7 @@
## Osnovne informacije
Azure Active Directory (Azure AD) služi kao Microsoftova usluga zasnovana na oblaku za upravljanje identitetom i pristupom. Ona je ključna za omogućavanje zaposlenima da se prijave i dobiju pristup resursima, kako unutar tako i van organizacije, uključujući Microsoft 365, Azure portal i brojne druge SaaS aplikacije. Dizajn Azure AD se fokusira na pružanje osnovnih usluga identiteta, posebno uključujući **autentifikaciju, autorizaciju i upravljanje korisnicima**.
Azure Active Directory (Azure AD) služi kao Microsoftova usluga zasnovana na oblaku za upravljanje identitetom i pristupom. Ona je ključna za omogućavanje zaposlenima da se prijave i dobiju pristup resursima, kako unutar tako i van organizacije, obuhvatajući Microsoft 365, Azure portal i mnoštvo drugih SaaS aplikacija. Dizajn Azure AD se fokusira na pružanje osnovnih usluga identiteta, posebno uključujući **autentifikaciju, autorizaciju i upravljanje korisnicima**.
Ključne karakteristike Azure AD uključuju **višefaktorsku autentifikaciju** i **uslovni pristup**, uz besprekornu integraciju sa drugim Microsoftovim bezbednosnim uslugama. Ove karakteristike značajno povećavaju bezbednost identiteta korisnika i omogućavaju organizacijama da efikasno implementiraju i sprovode svoje politike pristupa. Kao osnovna komponenta Microsoftovog ekosistema usluga u oblaku, Azure AD je ključan za upravljanje identitetima korisnika zasnovano na oblaku.
@@ -184,11 +184,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
{{#endtab }}
{{#endtabs }}
Kada se **prijavite** putem **CLI** u Azure sa bilo kojim programom, koristite **Azure aplikaciju** iz **tenanta** koji pripada **Microsoftu**. Ove aplikacije, poput onih koje možete kreirati u svom nalogu, **imaju klijent ID**. **Nećete moći da vidite sve njih** u **listama dozvoljenih aplikacija** koje možete videti u konzoli, **ali su po defaultu dozvoljene**.
Kada se **prijavite** putem **CLI** u Azure sa bilo kojim programom, koristite **Azure aplikaciju** iz **tenanta** koji pripada **Microsoftu**. Ove aplikacije, poput onih koje možete kreirati u svom nalogu, **imaju klijent id**. **Nećete moći da vidite sve njih** u **listama dozvoljenih aplikacija** koje možete videti u konzoli, **ali su po defaultu dozvoljene**.
Na primer, **powershell skripta** koja **autentifikuje** koristi aplikaciju sa klijent ID **`1950a258-227b-4e31-a9cf-717495945fc2`**. Čak i ako aplikacija ne pojavljuje u konzoli, sysadmin može **blokirati tu aplikaciju** tako da korisnici ne mogu pristupiti koristeći alate koji se povezuju putem te aplikacije.
Na primer, **powershell skripta** koja **autentifikuje** koristi aplikaciju sa klijent id **`1950a258-227b-4e31-a9cf-717495945fc2`**. Čak i ako aplikacija ne pojavljuje u konzoli, sysadmin može **blokirati tu aplikaciju** tako da korisnici ne mogu pristupiti koristeći alate koji se povezuju putem te aplikacije.
Međutim, postoje **drugi klijent-IDs** aplikacija koje **će vam omogućiti da se povežete na Azure**:
Međutim, postoje **drugi klijent-ids** aplikacija koje **će vam omogućiti da se povežete na Azure**:
```bash
# The important part is the ClientId, which identifies the application to login inside Azure
@@ -487,14 +487,14 @@ Vlasnici grupe mogu dodavati nove korisnike u grupu
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
```
> [!WARNING]
> Grupe mogu biti dinamične, što u osnovi znači da **ako korisnik ispuni određene uslove, biće dodat u grupu**. Naravno, ako su uslovi zasnovani na **atributima** koje **korisnik** može **kontrolisati**, mogao bi zloupotrebiti ovu funkciju da **uđe u druge grupe**.\
> Grupe mogu biti dinamične, što u suštini znači da **ako korisnik ispuni određene uslove, biće dodat u grupu**. Naravno, ako su uslovi zasnovani na **atributima** koje **korisnik** može **kontrolisati**, mogao bi zloupotrebiti ovu funkciju da **uđe u druge grupe**.\
> Proverite kako zloupotrebiti dinamične grupe na sledećoj stranici:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
{{#endref}}
### Servisni Principali
### Service Principals
Za više informacija o Entra ID servisnim principalima proverite:
@@ -708,7 +708,7 @@ Write-Output "Failed to Enumerate the Applications."
### Aplikacije
Za više informacija o Aplikacijama pogledajte:
Za više informacija o Aplikacijama proverite:
{{#ref}}
../az-basic-information/
@@ -716,7 +716,7 @@ Za više informacija o Aplikacijama pogledajte:
Kada se aplikacija generiše, dodeljuju se 2 tipa dozvola:
- **Dozvole** dodeljene **Servisnom Principalu**
- **Dozvole** dodeljene **Servisnom Principal**
- **Dozvole** koje **aplikacija** može imati i koristiti **u ime korisnika**.
{{#tabs }}
@@ -789,7 +789,7 @@ Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
> Za više informacija [**proverite ovo**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
> [!NOTE]
> Tajni niz koji aplikacija koristi da dokaže svoj identitet prilikom zahteva za token je lozinka aplikacije.\
> Tajni niz koji aplikacija koristi da dokaže svoj identitet prilikom traženja tokena je lozinka aplikacije.\
> Dakle, ako pronađete ovu **lozinku** možete pristupiti kao **service principal** **unutar** **tenanta**.\
> Imajte na umu da je ova lozinka vidljiva samo kada je generisana (možete je promeniti, ali je ne možete ponovo dobiti).\
> **Vlasnik** **aplikacije** može **dodati lozinku** (tako da može da se pretvara da je ona).\
@@ -840,11 +840,15 @@ az role definition list --resource-group <resource_group>
# Get only roles assigned to the indicated scope
az role definition list --scope <scope>
# Get all the principals a role is assigned to
az role assignment list --all --query "[].{principalName:principalName,principalType:principalType,resourceGroup:resourceGroup,roleDefinitionName:roleDefinitionName}[?roleDefinitionName=='<ROLE_NAME>']"
az role assignment list --all --query "[].{principalName:principalName,principalType:principalType,scope:scope,roleDefinitionName:roleDefinitionName}[?roleDefinitionName=='<ROLE_NAME>']"
# Get all the roles assigned to a user
az role assignment list --assignee "<email>" --all --output table
# Get all the roles assigned to a user by filtering
az role assignment list --all --query "[?principalName=='admin@organizationadmin.onmicrosoft.com']" --output table
# Get deny assignments
az rest --method GET --uri "https://management.azure.com/{scope}/providers/Microsoft.Authorization/denyAssignments?api-version=2022-04-01"
## Example scope of subscription
az rest --method GET --uri "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/providers/Microsoft.Authorization/denyAssignments?api-version=2022-04-01"
```
{{#endtab }}
@@ -877,12 +881,20 @@ Get-AzRoleDefinition -Name "Virtual Machine Command Executor"
# Get roles of a user or resource
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com
Get-AzRoleAssignment -Scope /subscriptions/<subscription-id>/resourceGroups/<res_group_name>/providers/Microsoft.Compute/virtualMachines/<vm_name>
# Get deny assignments
Get-AzDenyAssignment # Get from current subscription
Get-AzDenyAssignment -Scope '/subscriptions/96231a05-34ce-4eb4-aa6a-70759cbb5e83/resourcegroups/testRG/providers/Microsoft.Web/sites/site1'
```
{{#endtab }}
{{#endtabs }}
```
{{#endtab }}
{{#tab name="Raw" }}
```bash
# Get permissions over a resource using ARM directly
# Dobijanje dozvola za resurs koristeći ARM direktno
$Token = (Get-AzAccessToken).Token
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resourceGroups/Research/providers/Microsoft.Compute/virtualMachines/infradminsrv/providers/Microsoft.Authorization/permissions?api-version=2015-07-01'
$RequestParams = @{
@@ -894,12 +906,13 @@ Headers = @{
}
(Invoke-RestMethod @RequestParams).value
```
{{#endtab }}
{{#endtabs }}
### Entra ID Uloge
### Entra ID Roles
Za više informacija o Azure ulogama proverite:
For more information about Azure roles check:
{{#ref}}
../az-basic-information/
@@ -907,78 +920,85 @@ Za više informacija o Azure ulogama proverite:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List template Entra ID roles
# Lista šablona Entra ID uloga
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoleTemplates"
# List enabled built-in Entra ID roles
# Lista omogućenih ugrađenih Entra ID uloga
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles"
# List all Entra ID roles with their permissions (including custom roles)
# Lista svih Entra ID uloga sa njihovim dozvolama (uključujući prilagođene uloge)
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions"
# List only custom Entra ID roles
# Lista samo prilagođenih Entra ID uloga
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions" | jq '.value[] | select(.isBuiltIn == false)'
# List all assigned Entra ID roles
# Lista svih dodeljenih Entra ID uloga
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments"
# List members of a Entra ID roles
# Lista članova Entra ID uloga
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles/<role-id>/members"
# List Entra ID roles assigned to a user
# Lista Entra ID uloga dodeljenih korisniku
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/users/<user-id>/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
# List Entra ID roles assigned to a group
# Lista Entra ID uloga dodeljenih grupi
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/groups/$GROUP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
# List Entra ID roles assigned to a service principal
# Lista Entra ID uloga dodeljenih servisnom principalu
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$SP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
```
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# Get all available role templates
# Dobijte sve dostupne šablone uloga
Get-AzureADDirectoryroleTemplate
# Get enabled roles (Assigned roles)
# Dobijte omogućene uloge (dodeljene uloge)
Get-AzureADDirectoryRole
Get-AzureADDirectoryRole -ObjectId <roleID> #Get info about the role
# Get custom roles - use AzureAdPreview
Get-AzureADDirectoryRole -ObjectId <roleID> #Dobijte informacije o ulozi
# Dobijte prilagođene uloge - koristite AzureAdPreview
Get-AzureADMSRoleDefinition | ?{$_.IsBuiltin -eq $False} | select DisplayName
# Users assigned a role (Global Administrator)
# Korisnici dodeljeni ulozi (Globalni administrator)
Get-AzureADDirectoryRole -Filter "DisplayName eq 'Global Administrator'" | Get-AzureADDirectoryRoleMember
Get-AzureADDirectoryRole -ObjectId <id> | fl
# Roles of the Administrative Unit (who has permissions over the administrative unit and its members)
# Uloge Administrativne jedinice (ko ima dozvole nad administrativnom jedinicom i njenim članovima)
Get-AzureADMSScopedRoleMembership -Id <id> | fl *
```
{{#endtab }}
{{#endtabs }}
### Uređaji
### Devices
{{#tabs }}
{{#tab name="az cli" }}
```bash
# If you know how to do this send a PR!
# Ако znate kako to da uradite, pošaljite PR!
```
{{#endtab }}
{{#tab name="MS Graph" }}
```bash
# Enumerate devices using Microsoft Graph PowerShell
Get-MgDevice -All
@@ -998,34 +1018,36 @@ Get-Command -Module Microsoft.Graph.Identity.DirectoryManagement
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# Enumerate Devices
Get-AzureADDevice -All $true | fl *
# List all the active devices (and not the stale devices)
# Lista svih aktivnih uređaja (a ne zastarelih uređaja)
Get-AzureADDevice -All $true | ?{$_.ApproximateLastLogonTimeStamp -ne $null}
# Get owners of all devices
# Dobijte vlasnike svih uređaja
Get-AzureADDevice -All $true | Get-AzureADDeviceRegisteredOwner
Get-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredOwner -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}
# Registred users of all the devices
# Registrovani korisnici svih uređaja
Get-AzureADDevice -All $true | Get-AzureADDeviceRegisteredUser
Get-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredUser -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}
# Get dives managed using Intune
# Dobijte uređaje kojima upravlja Intune
Get-AzureADDevice -All $true | ?{$_.IsCompliant -eq "True"}
# Get devices owned by a user
# Dobijte uređaje u vlasništvu korisnika
Get-AzureADUserOwnedDevice -ObjectId test@corp.onmicrosoft.com
# Get Administrative Units of a device
# Dobijte administrativne jedinice uređaja
Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -ObjectId $_.ObjectId | where {$_.ObjectId -eq $deviceObjId} }
```
{{#endtab }}
{{#endtabs }}
> [!WARNING]
> Ako je uređaj (VM) **AzureAD povezan**, korisnici iz AzureAD će moći da se **prijave**.\
> Štaviše, ako je prijavljeni korisnik **Vlasnik** uređaja, on će biti **lokalni administrator**.
> If a device (VM) is **AzureAD joined**, users from AzureAD are going to be **able to login**.\
> Moreover, if the logged user is **Owner** of the device, he is going to be **local admin**.
### Administrativne jedinice
### Administrative Units
Za više informacija o administrativnim jedinicama pogledajte:
For more information about administrative units check:
{{#ref}}
../az-basic-information/
@@ -1033,100 +1055,104 @@ Za više informacija o administrativnim jedinicama pogledajte:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List all administrative units
# Lista svih administrativnih jedinica
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits"
# Get AU info
# Dobijanje informacija o AU
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53"
# Get members
# Dobijanje članova
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53/members"
# Get principals with roles over the AU
# Dobijanje principala sa rolama preko AU
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53/scopedRoleMembers"
```
{{#endtab }}
{{#tab name="AzureAD" }}
```bash
# Get Administrative Units
# Dobijanje administrativnih jedinica
Get-AzureADMSAdministrativeUnit
Get-AzureADMSAdministrativeUnit -Id <id>
# Get ID of admin unit by string
# Dobijanje ID-a administrativne jedinice po stringu
$adminUnitObj = Get-AzureADMSAdministrativeUnit -Filter "displayname eq 'Test administrative unit 2'"
# List the users, groups, and devices affected by the administrative unit
# Lista korisnika, grupa i uređaja koji su pogođeni administrativnom jedinicom
Get-AzureADMSAdministrativeUnitMember -Id <id>
# Get the roles users have over the members of the AU
Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
# Dobijanje uloga koje korisnici imaju nad članovima AU
Get-AzureADMSScopedRoleMembership -Id <id> | fl #Dobijanje ID-a uloge i članova uloge
```
{{#endtab }}
{{#endtabs }}
## Entra ID Eskalacija Privilegija
## Entra ID Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/
{{#endref}}
## Azure Eskalacija Privilegija
## Azure Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-authorization-privesc.md
{{#endref}}
## Odbrambeni Mehanizmi
## Defensive Mechanisms
### Upravljanje Privilegovanim Identitetima (PIM)
### Privileged Identity Management (PIM)
Upravljanje Privilegovanim Identitetima (PIM) u Azure pomaže da se **spreči dodeljivanje prekomernih privilegija** korisnicima bez potrebe.
Privileged Identity Management (PIM) in Azure helps to **prevent excessive privileges** to being assigned to users unnecessarily.
Jedna od glavnih funkcija koju PIM pruža je da omogućava da se ne dodeljuju uloge principima koji su konstantno aktivni, već da ih učini **prikladnim na određeni vremenski period (npr. 6 meseci)**. Tada, kada korisnik želi da aktivira tu ulogu, mora da je zatraži navodeći vreme koje mu je potrebno za privilegiju (npr. 3 sata). Tada **administrator mora da odobri** zahtev.\
Napomena: korisnik će takođe moći da zatraži da se **produži** vreme.
One of the main features provided by PIM is that It allows to not assign roles to principals that are constantly active, but make them **eligible for a period of time (e.g. 6months)**. Then, whenever the user wants to activate that role, he needs to ask for it indicating the time he needs the privilege (e.g. 3 hours). Then an **admin needs to approve** the request.\
Note that the user will also be able to ask to **extend** the time.
Pored toga, **PIM šalje emailove** svaki put kada se privilegovana uloga dodeljuje nekome.
Moreover, **PIM send emails** whenever a privileged role is being assigned to someone.
<figure><img src="../../../images/image (354).png" alt=""><figcaption></figcaption></figure>
Kada je PIM omogućen, moguće je konfigurisati svaku ulogu sa određenim zahtevima kao što su:
When PIM is enabled it's possible to configure each role with certain requirements like:
- Maksimalno trajanje (sati) aktivacije
- Zahtevati MFA prilikom aktivacije
- Zahtevati kontekst autentifikacije uslovnog pristupa
- Zahtevati opravdanje prilikom aktivacije
- Zahtevati informacije o tiketu prilikom aktivacije
- Zahtevati odobrenje za aktivaciju
- Maksimalno vreme za isteknuće prikladnih dodela
- Puno više konfiguracije o tome kada i kome slati obaveštenja kada se određene radnje dogode sa tom ulogom
- Maximum duration (hours) of activation
- Require MFA on activation
- Require Conditional Access acuthenticaiton context
- Require justification on activation
- Require ticket information on activation
- Require approval to activate
- Max time to expire the elegible assignments
- A lot more configuration on when and who to send notifications when certain actions happen with that role
### Politike Uslovnog Pristupa
### Conditional Access Policies
Proverite:
Check:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}
### Entra Zaštita Identiteta
### Entra Identity Protection
Entra Zaštita Identiteta je bezbednosna usluga koja omogućava **otkrivanje kada je korisnik ili prijavljivanje previše rizično** da bi bilo prihvaćeno, omogućavajući da se **blokira** korisnik ili pokušaj prijavljivanja.
Entra Identity Protection is a security service that allows to **detect when a user or a sign-in is too risky** to be accepted, allowing to **block** the user or the sig-in attempt.
Omogućava administratoru da je konfiguriše da **blokira** pokušaje kada je rizik "Nizak i iznad", "Srednji i iznad" ili "Visok". Iako je po defaultu potpuno **onemogućena**:
It allows the admin to configure it to **block** attempts when the risk is "Low and above", "Medium and above" or "High". Although, by default it's completely **disabled**:
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> Danas se preporučuje dodavanje ovih ograničenja putem politika uslovnog pristupa gde je moguće konfigurisati iste opcije.
> Nowadays it's recommended to add these restrictions via Conditional Access policies where it's possible to configure the same options.
### Entra Zaštita Lozinki
### Entra Password Protection
Entra Zaštita Lozinki ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) je bezbednosna funkcija koja **pomaže u sprečavanju zloupotrebe slabih lozinki tako što zaključava naloge kada se dogodi nekoliko neuspešnih pokušaja prijavljivanja**.\
Takođe omogućava da se **zabranjuje prilagođena lista lozinki** koju treba da obezbedite.
Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) is a security feature that **helps prevent the abuse of weak passwords in by locking out accounts when several unsuccessful login attempts happen**.\
It also allows to **ban a custom password list** that you need to provide.
Može se **primeniti i** na nivou oblaka i na lokalnom Active Directory-ju.
It can be **applied both** at the cloud level and on-premises Active Directory.
Podrazumevani režim je **Revizija**:
The default mode is **Audit**:
<figure><img src="../../../images/image (355).png" alt=""><figcaption></figcaption></figure>
## Reference
## References
- [https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units](https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units)