Az - Function Apps
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Azure Function Apps는 서버리스 컴퓨팅 서비스로, 기본 인프라를 관리하지 않고도 함수라고 불리는 작은 코드 조각을 실행할 수 있게 해줍니다. 이들은 HTTP 요청, 타이머 또는 Blob Storage나 Event Hubs와 같은 다른 Azure 서비스의 이벤트와 같은 다양한 트리거에 응답하여 코드를 실행하도록 설계되었습니다. Function Apps는 C#, Python, JavaScript, Java 등 여러 프로그래밍 언어를 지원하여 이벤트 기반 애플리케이션, 워크플로 자동화 또는 서비스 통합을 구축하는 데 유용합니다. 일반적으로 코드가 실행될 때 사용된 컴퓨팅 시간에 대해서만 비용을 지불하므로 비용 효율적입니다.
Functions는 App Services의 하위 집합이므로, 여기서 논의된 많은 기능은 Azure Apps(webapp
in cli)로 생성된 애플리케이션에서도 사용됩니다.
Flex Consumption Plan: 동적 이벤트 기반 확장을 제공하며, 수요에 따라 함수 인스턴스를 추가하거나 제거하는 사용한 만큼 지불하는 가격 모델입니다. 가상 네트워킹 및 사전 프로비저닝된 인스턴스를 지원하여 콜드 스타트를 줄여주며, 컨테이너 지원이 필요하지 않은 변동 작업 부하에 적합합니다.
Traditional Consumption Plan: 기본 서버리스 옵션으로, 함수가 실행될 때만 컴퓨팅 리소스에 대해 지불합니다. 수신 이벤트에 따라 자동으로 확장되며 콜드 스타트 최적화가 포함되어 있지만, 컨테이너 배포는 지원하지 않습니다. 자동 확장이 필요한 간헐적 작업 부하에 이상적입니다.
Premium Plan: 일관된 성능을 위해 설계되었으며, 콜드 스타트를 없애기 위해 사전 예열된 작업자를 제공합니다. 연장된 실행 시간, 가상 네트워킹을 제공하며, 사용자 정의 Linux 이미지를 지원하여 높은 성능과 고급 기능이 필요한 미션 크리티컬 애플리케이션에 적합합니다.
Dedicated Plan: 예측 가능한 청구가 가능한 전용 가상 머신에서 실행되며, 수동 또는 자동 확장을 지원합니다. 동일한 계획에서 여러 앱을 실행할 수 있으며, 컴퓨팅 격리를 제공하고 App Service Environments를 통해 안전한 네트워크 액세스를 보장하여 일관된 리소스 할당이 필요한 장기 실행 애플리케이션에 이상적입니다.
Container Apps: 관리되는 환경에서 컨테이너화된 함수 앱을 배포할 수 있으며, 마이크로서비스 및 API와 함께 사용할 수 있습니다. 사용자 정의 라이브러리, 레거시 앱 마이그레이션 및 GPU 처리를 지원하여 Kubernetes 클러스터 관리를 없애줍니다. 이벤트 기반, 확장 가능한 컨테이너화된 애플리케이션에 적합합니다.
컨테이너화되지 않은 새로운 Function App을 생성할 때, 코드 및 기타 Function 관련 데이터는 Storage 계정에 저장됩니다. 기본적으로 웹 콘솔은 코드를 저장하기 위해 함수당 새 Storage 계정을 생성합니다.
또한, 버킷 내의 코드를 수정하면 (저장될 수 있는 다양한 형식에서), 앱의 코드는 새로운 코드로 수정되어 다음에 함수가 호출될 때 실행됩니다.
이는 공격자의 관점에서 매우 흥미로운데, 이 버킷에 대한 쓰기 권한이 있으면 공격자가 코드를 손상시키고 Function App 내의 관리되는 ID에 대한 권한을 상승시킬 수 있습니다.
자세한 내용은 권한 상승 섹션에서 확인하십시오.
또한, azure-webjobs-secrets
컨테이너 내의 Storage 계정에서 마스터 및 함수 키를 찾는 것도 가능합니다. 이는 <app-name>
폴더 내의 JSON 파일에서 찾을 수 있습니다.
Functions는 또한 코드를 원격 위치에 저장할 수 있으며, 그 URL을 지정하기만 하면 됩니다.
HTTP 트리거를 사용하여:
인터넷의 모든 사용자에게 함수에 대한 액세스를 제공할 수 있으며, 인증을 요구하지 않거나 IAM 기반으로 액세스를 제공할 수 있습니다. 그러나 이 액세스를 제한하는 것도 가능합니다.
**내부 네트워크(VPC)**에서 Function App에 대한 액세스를 제공하거나 제한할 수도 있습니다.
이는 공격자의 관점에서 매우 흥미로운데, 인터넷에 노출된 취약한 Function에서 내부 네트워크로 피벗할 수 있는 가능성이 있습니다.
앱 내에서 환경 변수를 구성할 수 있으며, 이는 민감한 정보를 포함할 수 있습니다. 또한 기본적으로 AzureWebJobsStorage
및 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
(기타 포함)과 같은 env 변수가 생성됩니다. 이들은 애플리케이션 데이터가 포함된 Storage 계정을 FULL 권한으로 제어하는 계정 키를 포함하고 있어 특히 흥미롭습니다. 이러한 설정은 Storage 계정에서 코드를 실행하는 데에도 필요합니다.
이러한 env 변수 또는 구성 매개변수는 함수가 코드를 실행하는 방식을 제어하며, 예를 들어 **WEBSITE_RUN_FROM_PACKAGE
**가 존재하면 애플리케이션 코드가 위치한 URL을 나타냅니다.
리눅스 샌드박스 내에서 소스 코드는 **/home/site/wwwroot
**에 위치하며, 파일 function_app.py
(Python 사용 시)에서 코드를 실행하는 사용자는 **app
**입니다(권한 없음).
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
의 일부입니다.
VMs와 마찬가지로, Functions는 2가지 유형의 관리되는 ID를 가질 수 있습니다: 시스템 할당 및 사용자 할당.
시스템 할당된 ID는 해당 함수만 사용할 수 있는 관리되는 ID이며, 사용자 할당된 관리되는 ID는 다른 Azure 서비스가 사용할 수 있는 관리되는 ID입니다.
VMs와 마찬가지로, Functions는 1개의 시스템 할당 관리되는 ID와 여러 사용자 할당 관리되는 ID를 가질 수 있으므로, 함수를 손상시킬 경우 모든 관리되는 ID를 찾는 것이 항상 중요합니다. 하나의 Function에서 여러 관리되는 ID로 권한을 상승시킬 수 있습니다.
시스템 관리 ID가 사용되지 않고 하나 이상의 사용자 관리 ID가 함수에 연결된 경우, 기본적으로 토큰을 얻을 수 없습니다.
PEASS 스크립트를 사용하여 메타데이터 엔드포인트에서 기본 관리되는 ID의 토큰을 얻을 수 있습니다. 또는 다음과 같이 수동으로 얻을 수 있습니다:
함수가 연결된 모든 관리되는 ID를 확인하는 방법을 찾아야 하며, 이를 지정하지 않으면 메타데이터 엔드포인트는 기본 ID만 사용합니다(자세한 내용은 이전 링크를 참조하십시오).
사용자가 함수를 호출할 수 있는 액세스를 부여하는 RBAC 권한이 없음을 유의하십시오. **함수 호출은 생성 시 선택된 트리거에 따라 달라지며, HTTP 트리거가 선택된 경우 액세스 키를 사용해야 할 수 있습니다.
HTTP 트리거를 사용하여 함수 내에서 엔드포인트를 생성할 때, 함수를 트리거하는 데 필요한 액세스 키 권한 수준을 지정할 수 있습니다. 세 가지 옵션이 있습니다:
ANONYMOUS: 모든 사용자가 URL을 통해 함수에 접근할 수 있습니다.
FUNCTION: 엔드포인트는 함수, 호스트 또는 마스터 키를 사용하는 사용자만 접근할 수 있습니다.
ADMIN: 엔드포인트는 마스터 키를 가진 사용자만 접근할 수 있습니다.
키 유형:
Function Keys: 함수 키는 기본 또는 사용자 정의일 수 있으며, Function App 내의 특정 함수 엔드포인트에만 접근을 허용하도록 설계되었습니다.
Host Keys: 호스트 키는 기본 또는 사용자 정의일 수 있으며, FUNCTION 접근 수준으로 Function App 내의 모든 함수 엔드포인트에 접근을 제공합니다.
Master Key: 마스터 키(_master
)는 모든 함수 엔드포인트에 대한 접근을 포함하여 승격된 권한을 제공하는 관리 키입니다. 이 키는 취소할 수 없습니다.
System Keys: 시스템 키는 특정 확장에 의해 관리되며, 내부 구성 요소에서 사용하는 웹훅 엔드포인트에 접근하는 데 필요합니다. 예를 들어, Event Grid 트리거 및 Durable Functions는 시스템 키를 사용하여 해당 API와 안전하게 상호작용합니다.
키를 사용하여 함수 API 엔드포인트에 접근하는 예:
https://<function_uniq_name>.azurewebsites.net/api/<endpoint_name>?code=<access_key>
App Services와 마찬가지로, Functions는 SCM 및 FTP에 연결하여 코드를 배포하기 위해 Azure에서 제공하는 사용자 이름과 비밀번호가 포함된 URL을 사용하여 기본 인증을 지원합니다. 이에 대한 자세한 정보는:
함수가 Github 리포지토리에서 생성될 때 Azure 웹 콘솔은 특정 리포지토리에서 자동으로 Github 워크플로를 생성할 수 있게 해주며, 이 리포지토리가 업데이트될 때마다 함수의 코드가 업데이트됩니다. 실제로 Python 함수에 대한 Github Action yaml은 다음과 같습니다:
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)